diff --git a/src/common/backend/catalog/pg_enum.cpp b/src/common/backend/catalog/pg_enum.cpp index e8ede432326516b27b7d5fb109fb78ead9ce8783..cd5e034f62311c7ad3c72c0df45bb4c907ed000f 100644 --- a/src/common/backend/catalog/pg_enum.cpp +++ b/src/common/backend/catalog/pg_enum.cpp @@ -47,7 +47,7 @@ static int sort_order_cmp(const void* p1, const void* p2); * * vals is a list of Value strings. */ -void EnumValuesCreate(Oid enumTypeOid, List* vals) +void EnumValuesCreate(Oid enumTypeOid, List* vals, Oid collation) { Relation pg_enum = NULL; NameData enumlabel; @@ -60,6 +60,7 @@ void EnumValuesCreate(Oid enumTypeOid, List* vals) HeapTuple tup = NULL; num_elems = list_length(vals); + check_duplicate_value_by_collation(vals, collation, TYPTYPE_ENUM); /* * We do not bother to check the list of values for duplicates --- if you diff --git a/src/common/backend/catalog/pg_set.cpp b/src/common/backend/catalog/pg_set.cpp index 79335c9c01934dfc7468eb06330cc4270b4c1416..cf3e7e15d0ffd684428a7d3aa67b2be29cdddeb5 100644 --- a/src/common/backend/catalog/pg_set.cpp +++ b/src/common/backend/catalog/pg_set.cpp @@ -58,29 +58,6 @@ static void checkSetLableValue(char *label) } } -void check_duplicate_value_by_collation(List* vals, Oid collation, char type) -{ - if (!is_b_format_collation(collation)) { - return ; - } - - ListCell* lc = NULL; - foreach (lc, vals) { - ListCell* next_cell = lc->next; - char* lab = strVal(lfirst(lc)); - while(next_cell != NULL) { - char* next_lab = strVal(lfirst(next_cell)); - if (varstr_cmp_by_builtin_collations(lab, strlen(lab), next_lab, strlen(next_lab), collation) == 0) { - const char* type_name = NULL; - type_name = (type == TYPTYPE_SET) ? "set" : "enum"; - ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("%s has duplicate key value \"%s\" = \"%s\"", type_name, lab, next_lab))); - } - next_cell = lnext(next_cell); - } - } -} - /* * SetValuesCreate * Create an entry in pg_set for each of the supplied set values. diff --git a/src/common/backend/parser/parse_collate.cpp b/src/common/backend/parser/parse_collate.cpp index 624fcef3c98d3a7a4e63d3e6e1427424730f81f1..291e0dec0e386ff6362978289c1cd05d01fa124f 100644 --- a/src/common/backend/parser/parse_collate.cpp +++ b/src/common/backend/parser/parse_collate.cpp @@ -44,6 +44,7 @@ #include "catalog/pg_aggregate.h" #include "catalog/pg_collation.h" #include "catalog/pg_proc.h" +#include "catalog/gs_collation.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "parser/parse_collate.h" @@ -1342,3 +1343,26 @@ static void assign_expression_charset(Node* node, Oid target_collation) return; } + +void check_duplicate_value_by_collation(List* vals, Oid collation, char type) +{ + if (!is_b_format_collation(collation)) { + return ; + } + + ListCell* lc = NULL; + foreach (lc, vals) { + ListCell* next_cell = lc->next; + char* lab = strVal(lfirst(lc)); + while(next_cell != NULL) { + char* next_lab = strVal(lfirst(next_cell)); + if (varstr_cmp_by_builtin_collations(lab, strlen(lab), next_lab, strlen(next_lab), collation) == 0) { + const char* type_name = NULL; + type_name = (type == TYPTYPE_SET) ? "set" : "enum"; + ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("%s has duplicate key value \"%s\" = \"%s\"", type_name, lab, next_lab))); + } + next_cell = lnext(next_cell); + } + } +} \ No newline at end of file diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h index dd2e1c7c394ddff9a1d232cabb77775525c36ebb..d692ff0b6baaf5fd98ac5899123ac9a68bf574ad 100644 --- a/src/include/catalog/pg_enum.h +++ b/src/include/catalog/pg_enum.h @@ -63,7 +63,7 @@ typedef FormData_pg_enum *Form_pg_enum; /* * prototypes for functions in pg_enum.c */ -extern void EnumValuesCreate(Oid enumTypeOid, List *vals); +extern void EnumValuesCreate(Oid enumTypeOid, List *vals, Oid collation = InvalidOid); extern void EnumValuesDelete(Oid enumTypeOid); extern void AddEnumLabel(Oid enumTypeOid, const char *newVal, const char *neighbor, bool newValIsAfter, diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index c01264ee07a3b8ee478f61e4a0bb8e4d978d507b..ad380a880eebc08c8db49b6b32667454811293db 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -279,6 +279,7 @@ extern Datum int4setle(PG_FUNCTION_ARGS); extern Datum int4setge(PG_FUNCTION_ARGS); extern Datum findinset(PG_FUNCTION_ARGS); extern Datum btint8sortsupport(PG_FUNCTION_ARGS); +extern void check_duplicate_value_by_collation(List* vals, Oid collation, char type); /* int.c */ extern Datum int2in(PG_FUNCTION_ARGS);