From 50a16e30ebd76e70fc76abb2c8f0cd1e71deac41 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 22 Apr 2015 16:23:02 -0300 Subject: [PATCH] Use the right type OID after creating a shell type Commit a2e35b53c39b2a neglected to update the type OID to use further down in DefineType when TypeShellMake was changed to return ObjectAddress instead of OID (it got it right in DefineRange, however.) This resulted in an internal error message being issued when looking up I/O functions. Author: Michael Paquier Also add Asserts() to a couple of other places to ensure that the type OID being used is as expected. --- src/backend/commands/typecmds.c | 4 +++- src/test/regress/expected/create_type.out | 6 ++++++ src/test/regress/sql/create_type.sql | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 907ba1100a..7d8561022a 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -215,6 +215,7 @@ DefineType(List *names, List *parameters) if (!OidIsValid(typoid)) { address = TypeShellMake(typeName, typeNamespace, GetUserId()); + typoid = address.objectId; /* Make new shell type visible for modification below */ CommandCounterIncrement(); @@ -628,6 +629,7 @@ DefineType(List *names, List *parameters) 0, /* Array Dimensions of typbasetype */ false, /* Type NOT NULL */ collation); /* type's collation */ + Assert(typoid == address.objectId); /* * Create the array type that goes with it. @@ -1505,7 +1507,7 @@ DefineRange(CreateRangeStmt *stmt) 0, /* Array dimensions of typbasetype */ false, /* Type NOT NULL */ InvalidOid); /* type's collation (ranges never have one) */ - typoid = address.objectId; + Assert(typoid == address.objectId); /* Create the entry in pg_range */ RangeCreate(typoid, rangeSubtype, rangeCollation, rangeSubOpclass, diff --git a/src/test/regress/expected/create_type.out b/src/test/regress/expected/create_type.out index 35e8f5d6a2..b5af862ce5 100644 --- a/src/test/regress/expected/create_type.out +++ b/src/test/regress/expected/create_type.out @@ -107,6 +107,12 @@ ERROR: type "text_w_default" already exists DROP TYPE default_test_row CASCADE; NOTICE: drop cascades to function get_default_test() DROP TABLE default_test; +-- Check type create with input/output incompatibility +CREATE TYPE not_existing_type (INPUT = array_in, + OUTPUT = array_out, + ELEMENT = int, + INTERNALLENGTH = 32); +ERROR: function array_out(not_existing_type) does not exist -- Check usage of typmod with a user-defined type -- (we have borrowed numeric's typmod functions) CREATE TEMP TABLE mytab (foo widget(42,13,7)); -- should fail diff --git a/src/test/regress/sql/create_type.sql b/src/test/regress/sql/create_type.sql index 96a075b026..29ba625b46 100644 --- a/src/test/regress/sql/create_type.sql +++ b/src/test/regress/sql/create_type.sql @@ -106,6 +106,12 @@ DROP TYPE default_test_row CASCADE; DROP TABLE default_test; +-- Check type create with input/output incompatibility +CREATE TYPE not_existing_type (INPUT = array_in, + OUTPUT = array_out, + ELEMENT = int, + INTERNALLENGTH = 32); + -- Check usage of typmod with a user-defined type -- (we have borrowed numeric's typmod functions) -- 2.40.0