From 452f37559e75990aa78157a969afe75fd40f3565 Mon Sep 17 00:00:00 2001 From: Lamaric Date: Thu, 26 Oct 2023 17:37:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86enable=5Fsegment=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=94=BE=E5=BC=80=E5=90=8E=E7=9B=B8=E5=85=B3=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/utils/misc/guc/guc_storage.cpp | 2 +- .../optimizer/commands/tablecmds.cpp | 12 +- .../storage/access/common/reloptions.cpp | 28 +++++ src/include/access/reloptions.h | 1 + .../regress/expected/create_seg_table.out | 106 ++++++++++++++++++ src/test/regress/parallel_schedule0 | 1 + src/test/regress/parallel_schedule0A | 1 + src/test/regress/sql/create_seg_table.sql | 31 +++++ 8 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 src/test/regress/expected/create_seg_table.out create mode 100644 src/test/regress/sql/create_seg_table.sql diff --git a/src/common/backend/utils/misc/guc/guc_storage.cpp b/src/common/backend/utils/misc/guc/guc_storage.cpp index aad9de4db..d545a1200 100755 --- a/src/common/backend/utils/misc/guc/guc_storage.cpp +++ b/src/common/backend/utils/misc/guc/guc_storage.cpp @@ -984,7 +984,7 @@ static void InitStorageConfigureNamesBool() PGC_SIGHUP, NODE_ALL, UNGROUPED, - gettext_noop("create segment table, only used in debug mode"), + gettext_noop("create segment table."), NULL}, &u_sess->attr.attr_storage.enable_segment, false, diff --git a/src/gausskernel/optimizer/commands/tablecmds.cpp b/src/gausskernel/optimizer/commands/tablecmds.cpp index 98e1d17e6..a9c7ff1c6 100755 --- a/src/gausskernel/optimizer/commands/tablecmds.cpp +++ b/src/gausskernel/optimizer/commands/tablecmds.cpp @@ -2865,8 +2865,12 @@ ObjectAddress DefineRelation(CreateStmt* stmt, char relkind, Oid ownerId, Object if (!IsInitdb && (relkind == RELKIND_RELATION) && !IsSystemNamespace(namespaceId) && !IsCStoreNamespace(namespaceId) && (pg_strcasecmp(storeChar, ORIENTATION_ROW) == 0) && (stmt->relation->relpersistence == RELPERSISTENCE_PERMANENT) && !u_sess->attr.attr_storage.enable_recyclebin) { - if (u_sess->attr.attr_storage.enable_segment || bucketinfo != NULL) { + bool isSegmentType = (storage_type == SEGMENT_PAGE); + if (!isSegmentType && (u_sess->attr.attr_storage.enable_segment || bucketinfo != NULL)) { storage_type = SEGMENT_PAGE; + DefElem *storage_def = makeDefElem("segment", (Node *)makeString("on")); + stmt->options = lappend(stmt->options, storage_def); + reloptions = transformRelOptions((Datum)0, stmt->options, NULL, validnsps, true, false); } } else if (storage_type == SEGMENT_PAGE) { if (u_sess->attr.attr_storage.enable_recyclebin) { @@ -2909,6 +2913,12 @@ ObjectAddress DefineRelation(CreateStmt* stmt, char relkind, Oid ownerId, Object } } + if (!IsInitdb && u_sess->attr.attr_storage.enable_segment && storage_type == SEGMENT_PAGE && + !CheckSegmentStorageOption(stmt->options)) { + ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("Only support segment storage type while parameter enable_segment is ON."))); + } + /* * Create the relation. Inherited defaults and constraints are passed in * for immediate handling --- since they don't need parsing, they can be diff --git a/src/gausskernel/storage/access/common/reloptions.cpp b/src/gausskernel/storage/access/common/reloptions.cpp index 247884b42..c3764296b 100644 --- a/src/gausskernel/storage/access/common/reloptions.cpp +++ b/src/gausskernel/storage/access/common/reloptions.cpp @@ -3109,6 +3109,34 @@ void CheckCompressOption(TableCreateSupport *tableCreateSupport) } } +bool CheckSegmentStorageOption(List *options) +{ + if (options == NULL) { + return true; + } + + ListCell *opt = NULL; + bool result = true; + foreach (opt, options) { + DefElem *def = (DefElem *)lfirst(opt); + + if (pg_strcasecmp(def->defname, "segment") == 0) { + /* + * def->arg is NULL, that means it's a RESET action. ignore it. + * def->arg is not NULL, that means it's a SET action, so check it. + */ + if (def->arg) { + const char *valstr = defGetString(def); + if (pg_strcasecmp(valstr, "off") == 0) + result = false; + } + break; + } + } + + return result; +} + #ifdef USE_SPQ /* * before check spq reloption, make sure guc params of spq_enable_btbuild is on diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h index a73af3d05..f85c605ef 100644 --- a/src/include/access/reloptions.h +++ b/src/include/access/reloptions.h @@ -307,5 +307,6 @@ void ForbidUserToSetCompressedOptions(List *options); void SetOneOfCompressOption(DefElem* defElem, TableCreateSupport *tableCreateSupport); bool ReadBoolFromDefElem(DefElem* defElem); void CheckCompressOption(TableCreateSupport *tableCreateSupport); +bool CheckSegmentStorageOption(List *options); #endif /* RELOPTIONS_H */ diff --git a/src/test/regress/expected/create_seg_table.out b/src/test/regress/expected/create_seg_table.out new file mode 100644 index 000000000..efdee56ea --- /dev/null +++ b/src/test/regress/expected/create_seg_table.out @@ -0,0 +1,106 @@ +-- modify enble_segment parameter +drop table if exists tab_segment; +NOTICE: table "tab_segment" does not exist, skipping +drop table if exists tab_segment_off; +NOTICE: table "tab_segment_off" does not exist, skipping +drop table if exists tab_segment_on; +NOTICE: table "tab_segment_on" does not exist, skipping +show enable_segment; + enable_segment +---------------- + off +(1 row) + +alter system set enable_segment = on; +select pg_sleep(1); + pg_sleep +---------- + +(1 row) + +show enable_segment; + enable_segment +---------------- + on +(1 row) + +create table tab_segment(a int); +create table tab_segment_off(a int) with(segment=off); +ERROR: Only support segment storage type while parameter enable_segment is ON. +create table tab_segment_on(a int) with(segment=on); +\d+ tab_segment; + Table "public.tab_segment" + Column | Type | Modifiers | Storage | Stats target | Description +--------+---------+-----------+---------+--------------+------------- + a | integer | | plain | | +Has OIDs: no +Options: orientation=row, compression=no, segment=on + +\d+ tab_segment_off; +\d+ tab_segment_on; + Table "public.tab_segment_on" + Column | Type | Modifiers | Storage | Stats target | Description +--------+---------+-----------+---------+--------------+------------- + a | integer | | plain | | +Has OIDs: no +Options: orientation=row, segment=on, compression=no + +drop table tab_segment; +drop table if exists tab_segment_off; +NOTICE: table "tab_segment_off" does not exist, skipping +drop table if exists tab_segment_on; +select pg_sleep(1); + pg_sleep +---------- + +(1 row) + +show enable_segment; + enable_segment +---------------- + on +(1 row) + +alter system set enable_segment = off; +select pg_sleep(1); + pg_sleep +---------- + +(1 row) + +show enable_segment; + enable_segment +---------------- + off +(1 row) + +create table tab_segment(a int); +create table tab_segment_off(a int) with(segment=off); +create table tab_segment_on(a int) with(segment=on); +\d+ tab_segment; + Table "public.tab_segment" + Column | Type | Modifiers | Storage | Stats target | Description +--------+---------+-----------+---------+--------------+------------- + a | integer | | plain | | +Has OIDs: no +Options: orientation=row, compression=no + +\d+ tab_segment_off; + Table "public.tab_segment_off" + Column | Type | Modifiers | Storage | Stats target | Description +--------+---------+-----------+---------+--------------+------------- + a | integer | | plain | | +Has OIDs: no +Options: orientation=row, segment=off, compression=no + +\d+ tab_segment_on; + Table "public.tab_segment_on" + Column | Type | Modifiers | Storage | Stats target | Description +--------+---------+-----------+---------+--------------+------------- + a | integer | | plain | | +Has OIDs: no +Options: orientation=row, segment=on, compression=no + +drop table tab_segment; +drop table if exists tab_segment_off; +drop table if exists tab_segment_on; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index a4b809550..225e5a09e 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -408,6 +408,7 @@ test: partiton_pathkey_col_plan partiton_pathkey_col_randomexec partiton_pathkey #test: create_function_1 test: create_table create_table_2 create_table_3 test: temp__4 +test: create_seg_table #test: copy# diff --git a/src/test/regress/parallel_schedule0A b/src/test/regress/parallel_schedule0A index 8fc13e609..e9bbc29eb 100644 --- a/src/test/regress/parallel_schedule0A +++ b/src/test/regress/parallel_schedule0A @@ -400,6 +400,7 @@ test: partiton_pathkey_col_plan partiton_pathkey_col_randomexec partiton_pathkey #test: create_function_1 test: create_table create_table_2 create_table_3 test: temp__4 +test: create_seg_table #test: copy# diff --git a/src/test/regress/sql/create_seg_table.sql b/src/test/regress/sql/create_seg_table.sql new file mode 100644 index 000000000..c7f105e16 --- /dev/null +++ b/src/test/regress/sql/create_seg_table.sql @@ -0,0 +1,31 @@ +-- modify enble_segment parameter +drop table if exists tab_segment; +drop table if exists tab_segment_off; +drop table if exists tab_segment_on; +show enable_segment; +alter system set enable_segment = on; +select pg_sleep(1); +show enable_segment; +create table tab_segment(a int); +create table tab_segment_off(a int) with(segment=off); +create table tab_segment_on(a int) with(segment=on); +\d+ tab_segment; +\d+ tab_segment_off; +\d+ tab_segment_on; +drop table tab_segment; +drop table if exists tab_segment_off; +drop table if exists tab_segment_on; +select pg_sleep(1); +show enable_segment; +alter system set enable_segment = off; +select pg_sleep(1); +show enable_segment; +create table tab_segment(a int); +create table tab_segment_off(a int) with(segment=off); +create table tab_segment_on(a int) with(segment=on); +\d+ tab_segment; +\d+ tab_segment_off; +\d+ tab_segment_on; +drop table tab_segment; +drop table if exists tab_segment_off; +drop table if exists tab_segment_on;