mirror of https://github.com/citusdata/citus.git
Merge pull request #3832 from citusdata/fix/varchar-type-propagation
Fix composite types lacking typemod when distributedpull/3836/head
commit
4ad10adbc4
|
@ -712,15 +712,13 @@ RecreateCompositeTypeStmt(Oid typeOid)
|
||||||
/*
|
/*
|
||||||
* attributeFormToColumnDef returns a ColumnDef * describing the field and its property
|
* attributeFormToColumnDef returns a ColumnDef * describing the field and its property
|
||||||
* for a pg_attribute entry.
|
* for a pg_attribute entry.
|
||||||
*
|
|
||||||
* Note: Current implementation is only covering the features supported by composite types
|
|
||||||
*/
|
*/
|
||||||
static ColumnDef *
|
static ColumnDef *
|
||||||
attributeFormToColumnDef(Form_pg_attribute attributeForm)
|
attributeFormToColumnDef(Form_pg_attribute attributeForm)
|
||||||
{
|
{
|
||||||
return makeColumnDef(NameStr(attributeForm->attname),
|
return makeColumnDef(NameStr(attributeForm->attname),
|
||||||
attributeForm->atttypid,
|
attributeForm->atttypid,
|
||||||
-1,
|
attributeForm->atttypmod,
|
||||||
attributeForm->attcollation);
|
attributeForm->attcollation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -378,7 +378,11 @@ AppendColumnDefList(StringInfo str, List *columnDefs)
|
||||||
static void
|
static void
|
||||||
AppendColumnDef(StringInfo str, ColumnDef *columnDef)
|
AppendColumnDef(StringInfo str, ColumnDef *columnDef)
|
||||||
{
|
{
|
||||||
Oid typeOid = LookupTypeNameOid(NULL, columnDef->typeName, false);
|
int32 typmod = 0;
|
||||||
|
Oid typeOid = InvalidOid;
|
||||||
|
bits16 formatFlags = FORMAT_TYPE_TYPEMOD_GIVEN | FORMAT_TYPE_FORCE_QUALIFY;
|
||||||
|
|
||||||
|
typenameTypeIdAndMod(NULL, columnDef->typeName, &typeOid, &typmod);
|
||||||
Oid collationOid = GetColumnDefCollation(NULL, columnDef, typeOid);
|
Oid collationOid = GetColumnDefCollation(NULL, columnDef, typeOid);
|
||||||
|
|
||||||
Assert(!columnDef->is_not_null); /* not null is not supported on composite types */
|
Assert(!columnDef->is_not_null); /* not null is not supported on composite types */
|
||||||
|
@ -388,7 +392,7 @@ AppendColumnDef(StringInfo str, ColumnDef *columnDef)
|
||||||
appendStringInfo(str, "%s ", quote_identifier(columnDef->colname));
|
appendStringInfo(str, "%s ", quote_identifier(columnDef->colname));
|
||||||
}
|
}
|
||||||
|
|
||||||
appendStringInfo(str, "%s", format_type_be_qualified(typeOid));
|
appendStringInfo(str, "%s", format_type_extended(typeOid, typmod, formatFlags));
|
||||||
|
|
||||||
if (OidIsValid(collationOid))
|
if (OidIsValid(collationOid))
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,7 +14,7 @@ CREATE SCHEMA type_tests2 AUTHORIZATION typeuser; -- to test creation in a speci
|
||||||
SET search_path TO type_tests;
|
SET search_path TO type_tests;
|
||||||
SET citus.shard_count TO 4;
|
SET citus.shard_count TO 4;
|
||||||
-- single statement transactions with a simple type used in a table
|
-- single statement transactions with a simple type used in a table
|
||||||
CREATE TYPE tc1 AS (a int, b int);
|
CREATE TYPE tc1 AS (a int, b varchar(20));
|
||||||
CREATE TABLE t1 (a int PRIMARY KEY, b tc1);
|
CREATE TABLE t1 (a int PRIMARY KEY, b tc1);
|
||||||
SELECT create_distributed_table('t1','a');
|
SELECT create_distributed_table('t1','a');
|
||||||
create_distributed_table
|
create_distributed_table
|
||||||
|
@ -22,7 +22,7 @@ SELECT create_distributed_table('t1','a');
|
||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
INSERT INTO t1 VALUES (1, (2,3)::tc1);
|
INSERT INTO t1 VALUES (1, (2,'3')::tc1);
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
a | b
|
a | b
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
@ -30,10 +30,18 @@ SELECT * FROM t1;
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
ALTER TYPE tc1 RENAME TO tc1_newname;
|
ALTER TYPE tc1 RENAME TO tc1_newname;
|
||||||
INSERT INTO t1 VALUES (3, (4,5)::tc1_newname); -- insert with a cast would fail if the rename didn't propagate
|
INSERT INTO t1 VALUES (3, (4,'5')::tc1_newname); -- insert with a cast would fail if the rename didn't propagate
|
||||||
ALTER TYPE tc1_newname SET SCHEMA type_tests2;
|
ALTER TYPE tc1_newname SET SCHEMA type_tests2;
|
||||||
INSERT INTO t1 VALUES (6, (7,8)::type_tests2.tc1_newname); -- insert with a cast would fail if the rename didn't propagate
|
INSERT INTO t1 VALUES (6, (7,'8')::type_tests2.tc1_newname); -- insert with a cast would fail if the rename didn't propagate
|
||||||
-- single statement transactions with a an enum used in a table
|
-- verify typmod was propagated
|
||||||
|
SELECT run_command_on_workers($$SELECT atttypmod FROM pg_attribute WHERE attnum = 2 AND attrelid = (SELECT typrelid FROM pg_type WHERE typname = 'tc1_newname');$$);
|
||||||
|
run_command_on_workers
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
(localhost,57637,t,24)
|
||||||
|
(localhost,57638,t,24)
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
-- single statement transactions with an enum used in a table
|
||||||
CREATE TYPE te1 AS ENUM ('one', 'two', 'three');
|
CREATE TYPE te1 AS ENUM ('one', 'two', 'three');
|
||||||
CREATE TABLE t2 (a int PRIMARY KEY, b te1);
|
CREATE TABLE t2 (a int PRIMARY KEY, b te1);
|
||||||
SELECT create_distributed_table('t2','a');
|
SELECT create_distributed_table('t2','a');
|
||||||
|
@ -65,7 +73,7 @@ ALTER TYPE te1_newname SET SCHEMA type_tests2;
|
||||||
INSERT INTO t2 VALUES (3, 'three'::type_tests2.te1_newname);
|
INSERT INTO t2 VALUES (3, 'three'::type_tests2.te1_newname);
|
||||||
-- transaction block with simple type
|
-- transaction block with simple type
|
||||||
BEGIN;
|
BEGIN;
|
||||||
CREATE TYPE tc2 AS (a int, b int);
|
CREATE TYPE tc2 AS (a varchar(10), b int);
|
||||||
CREATE TABLE t3 (a int PRIMARY KEY, b tc2);
|
CREATE TABLE t3 (a int PRIMARY KEY, b tc2);
|
||||||
SELECT create_distributed_table('t3','a');
|
SELECT create_distributed_table('t3','a');
|
||||||
create_distributed_table
|
create_distributed_table
|
||||||
|
@ -73,13 +81,21 @@ SELECT create_distributed_table('t3','a');
|
||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
INSERT INTO t3 VALUES (4, (5,6)::tc2);
|
INSERT INTO t3 VALUES (4, ('5',6)::tc2);
|
||||||
SELECT * FROM t3;
|
SELECT * FROM t3;
|
||||||
a | b
|
a | b
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
4 | (5,6)
|
4 | (5,6)
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- verify typmod was propagated
|
||||||
|
SELECT run_command_on_workers($$SELECT atttypmod FROM pg_attribute WHERE attnum = 1 AND attrelid = (SELECT typrelid FROM pg_type WHERE typname = 'tc2');$$);
|
||||||
|
run_command_on_workers
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
(localhost,57637,t,14)
|
||||||
|
(localhost,57638,t,14)
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
-- transaction block with simple type
|
-- transaction block with simple type
|
||||||
BEGIN;
|
BEGIN;
|
||||||
|
|
|
@ -33,7 +33,7 @@ SELECT master_remove_node('localhost', :worker_2_port);
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- reproduction case as described in #3378
|
-- reproduction case as described in #3378
|
||||||
CREATE TABLE zoop_table (x int, y int);
|
CREATE TABLE zoop_table (x int, y decimal(4, 4));
|
||||||
SELECT create_distributed_table('zoop_table','x');
|
SELECT create_distributed_table('zoop_table','x');
|
||||||
create_distributed_table
|
create_distributed_table
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
@ -73,6 +73,15 @@ SELECT public.wait_until_metadata_sync(30000);
|
||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- verify typmod of zoop_table.b was propagated
|
||||||
|
-- see numerictypmodin in postgres for how typmod is derived
|
||||||
|
SELECT run_command_on_workers($$SELECT atttypmod FROM pg_attribute WHERE attnum = 2 AND attrelid = (SELECT typrelid FROM pg_type WHERE typname = 'zoop_table');$$);
|
||||||
|
run_command_on_workers
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
(localhost,57637,t,262152)
|
||||||
|
(localhost,57638,t,262152)
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
-- clean up after testing
|
-- clean up after testing
|
||||||
DROP SCHEMA function_table_reference CASCADE;
|
DROP SCHEMA function_table_reference CASCADE;
|
||||||
NOTICE: drop cascades to 2 other objects
|
NOTICE: drop cascades to 2 other objects
|
||||||
|
|
|
@ -9,17 +9,20 @@ SET search_path TO type_tests;
|
||||||
SET citus.shard_count TO 4;
|
SET citus.shard_count TO 4;
|
||||||
|
|
||||||
-- single statement transactions with a simple type used in a table
|
-- single statement transactions with a simple type used in a table
|
||||||
CREATE TYPE tc1 AS (a int, b int);
|
CREATE TYPE tc1 AS (a int, b varchar(20));
|
||||||
CREATE TABLE t1 (a int PRIMARY KEY, b tc1);
|
CREATE TABLE t1 (a int PRIMARY KEY, b tc1);
|
||||||
SELECT create_distributed_table('t1','a');
|
SELECT create_distributed_table('t1','a');
|
||||||
INSERT INTO t1 VALUES (1, (2,3)::tc1);
|
INSERT INTO t1 VALUES (1, (2,'3')::tc1);
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ALTER TYPE tc1 RENAME TO tc1_newname;
|
ALTER TYPE tc1 RENAME TO tc1_newname;
|
||||||
INSERT INTO t1 VALUES (3, (4,5)::tc1_newname); -- insert with a cast would fail if the rename didn't propagate
|
INSERT INTO t1 VALUES (3, (4,'5')::tc1_newname); -- insert with a cast would fail if the rename didn't propagate
|
||||||
ALTER TYPE tc1_newname SET SCHEMA type_tests2;
|
ALTER TYPE tc1_newname SET SCHEMA type_tests2;
|
||||||
INSERT INTO t1 VALUES (6, (7,8)::type_tests2.tc1_newname); -- insert with a cast would fail if the rename didn't propagate
|
INSERT INTO t1 VALUES (6, (7,'8')::type_tests2.tc1_newname); -- insert with a cast would fail if the rename didn't propagate
|
||||||
|
|
||||||
-- single statement transactions with a an enum used in a table
|
-- verify typmod was propagated
|
||||||
|
SELECT run_command_on_workers($$SELECT atttypmod FROM pg_attribute WHERE attnum = 2 AND attrelid = (SELECT typrelid FROM pg_type WHERE typname = 'tc1_newname');$$);
|
||||||
|
|
||||||
|
-- single statement transactions with an enum used in a table
|
||||||
CREATE TYPE te1 AS ENUM ('one', 'two', 'three');
|
CREATE TYPE te1 AS ENUM ('one', 'two', 'three');
|
||||||
CREATE TABLE t2 (a int PRIMARY KEY, b te1);
|
CREATE TABLE t2 (a int PRIMARY KEY, b te1);
|
||||||
SELECT create_distributed_table('t2','a');
|
SELECT create_distributed_table('t2','a');
|
||||||
|
@ -40,11 +43,14 @@ INSERT INTO t2 VALUES (3, 'three'::type_tests2.te1_newname);
|
||||||
|
|
||||||
-- transaction block with simple type
|
-- transaction block with simple type
|
||||||
BEGIN;
|
BEGIN;
|
||||||
CREATE TYPE tc2 AS (a int, b int);
|
CREATE TYPE tc2 AS (a varchar(10), b int);
|
||||||
CREATE TABLE t3 (a int PRIMARY KEY, b tc2);
|
CREATE TABLE t3 (a int PRIMARY KEY, b tc2);
|
||||||
SELECT create_distributed_table('t3','a');
|
SELECT create_distributed_table('t3','a');
|
||||||
INSERT INTO t3 VALUES (4, (5,6)::tc2);
|
INSERT INTO t3 VALUES (4, ('5',6)::tc2);
|
||||||
SELECT * FROM t3;
|
SELECT * FROM t3;
|
||||||
|
|
||||||
|
-- verify typmod was propagated
|
||||||
|
SELECT run_command_on_workers($$SELECT atttypmod FROM pg_attribute WHERE attnum = 1 AND attrelid = (SELECT typrelid FROM pg_type WHERE typname = 'tc2');$$);
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
-- transaction block with simple type
|
-- transaction block with simple type
|
||||||
|
|
|
@ -22,7 +22,7 @@ SELECT start_metadata_sync_to_node('localhost', :worker_2_port);
|
||||||
SELECT master_remove_node('localhost', :worker_2_port);
|
SELECT master_remove_node('localhost', :worker_2_port);
|
||||||
|
|
||||||
-- reproduction case as described in #3378
|
-- reproduction case as described in #3378
|
||||||
CREATE TABLE zoop_table (x int, y int);
|
CREATE TABLE zoop_table (x int, y decimal(4, 4));
|
||||||
SELECT create_distributed_table('zoop_table','x');
|
SELECT create_distributed_table('zoop_table','x');
|
||||||
|
|
||||||
-- Create a function that refers to the distributed table
|
-- Create a function that refers to the distributed table
|
||||||
|
@ -46,6 +46,9 @@ SELECT create_distributed_function('zoop(int)', '$1');
|
||||||
SELECT 1 FROM master_add_node('localhost', :worker_2_port);
|
SELECT 1 FROM master_add_node('localhost', :worker_2_port);
|
||||||
SELECT public.wait_until_metadata_sync(30000);
|
SELECT public.wait_until_metadata_sync(30000);
|
||||||
|
|
||||||
|
-- verify typmod of zoop_table.b was propagated
|
||||||
|
-- see numerictypmodin in postgres for how typmod is derived
|
||||||
|
SELECT run_command_on_workers($$SELECT atttypmod FROM pg_attribute WHERE attnum = 2 AND attrelid = (SELECT typrelid FROM pg_type WHERE typname = 'zoop_table');$$);
|
||||||
|
|
||||||
-- clean up after testing
|
-- clean up after testing
|
||||||
DROP SCHEMA function_table_reference CASCADE;
|
DROP SCHEMA function_table_reference CASCADE;
|
||||||
|
|
Loading…
Reference in New Issue