diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/commands/tablecmds.c | 10 | ||||
-rw-r--r-- | src/test/regress/expected/create_table.out | 13 | ||||
-rw-r--r-- | src/test/regress/sql/create_table.sql | 12 |
3 files changed, 33 insertions, 2 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 7d034d26415..59efa323388 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -13424,6 +13424,16 @@ ComputePartitionAttrs(Relation rel, List *partParams, AttrNumber *partattrs, attcollation = exprCollation(expr); /* + * The expression must be of a storable type (e.g., not RECORD). + * The test is the same as for whether a table column is of a safe + * type (which is why we needn't check for the non-expression + * case). + */ + CheckAttributeType("partition key", + atttype, attcollation, + NIL, false); + + /* * Strip any top-level COLLATE clause. This ensures that we treat * "x COLLATE y" and "(x COLLATE y)" alike. */ diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 286e39a4989..56df6e7daa4 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -341,7 +341,7 @@ CREATE TABLE partitioned ( ERROR: cannot use subquery in partition key expression CREATE TABLE partitioned ( a int -) PARTITION BY RANGE (('a')); +) PARTITION BY RANGE ((42)); ERROR: cannot use constant expression as partition key CREATE FUNCTION const_func () RETURNS int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; CREATE TABLE partitioned ( @@ -364,6 +364,17 @@ CREATE TABLE partitioned ( a int ) PARTITION BY RANGE (xmin); ERROR: cannot use system column "xmin" in partition key +-- cannot use pseudotypes +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (((a, b))); +ERROR: column "partition key" has pseudo-type record +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (a, ('unknown')); +ERROR: column "partition key" has pseudo-type unknown -- functions in key must be immutable CREATE FUNCTION immut_func (a int) RETURNS int AS $$ SELECT a + random()::int; $$ LANGUAGE SQL; CREATE TABLE partitioned ( diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index 37bbb657a6a..6edb4bba2a2 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -345,7 +345,7 @@ CREATE TABLE partitioned ( CREATE TABLE partitioned ( a int -) PARTITION BY RANGE (('a')); +) PARTITION BY RANGE ((42)); CREATE FUNCTION const_func () RETURNS int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; CREATE TABLE partitioned ( @@ -368,6 +368,16 @@ CREATE TABLE partitioned ( a int ) PARTITION BY RANGE (xmin); +-- cannot use pseudotypes +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (((a, b))); +CREATE TABLE partitioned ( + a int, + b int +) PARTITION BY RANGE (a, ('unknown')); + -- functions in key must be immutable CREATE FUNCTION immut_func (a int) RETURNS int AS $$ SELECT a + random()::int; $$ LANGUAGE SQL; CREATE TABLE partitioned ( |