diff options
-rw-r--r-- | src/backend/access/common/printtup.c | 10 | ||||
-rw-r--r-- | src/backend/catalog/namespace.c | 1 | ||||
-rw-r--r-- | src/backend/pgxc/pool/execRemote.c | 11 | ||||
-rw-r--r-- | src/test/regress/expected/xl_misc.out | 164 | ||||
-rw-r--r-- | src/test/regress/parallel_schedule | 2 | ||||
-rw-r--r-- | src/test/regress/sql/xl_misc.sql | 95 |
6 files changed, 280 insertions, 3 deletions
diff --git a/src/backend/access/common/printtup.c b/src/backend/access/common/printtup.c index 78704dafd9..e89484aac3 100644 --- a/src/backend/access/common/printtup.c +++ b/src/backend/access/common/printtup.c @@ -215,8 +215,16 @@ SendRowDescriptionMessage(TupleDesc typeinfo, List *targetlist, int16 *formats) */ if (IsConnFromCoord()) { - char *typename; + char *typename, *typeschema_name; + Oid typeschema_oid; + typename = get_typename(atttypid); + typeschema_oid = get_typ_namespace(atttypid); + typeschema_name = isTempNamespace(typeschema_oid) ? + "pg_temp" : + get_namespace_name(typeschema_oid); + + pq_sendstring(&buf, typeschema_name); pq_sendstring(&buf, typename); } #endif diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index cd03f2b6bf..c8033f5054 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -29,6 +29,7 @@ #endif #include "access/xlog.h" #include "catalog/dependency.h" +#include "catalog/namespace.h" #include "catalog/objectaccess.h" #include "catalog/pg_authid.h" #include "catalog/pg_collation.h" diff --git a/src/backend/pgxc/pool/execRemote.c b/src/backend/pgxc/pool/execRemote.c index b9337d70e5..1b547b21be 100644 --- a/src/backend/pgxc/pool/execRemote.c +++ b/src/backend/pgxc/pool/execRemote.c @@ -24,6 +24,7 @@ #include "access/transam.h" #include "access/xact.h" #include "access/relscan.h" +#include "catalog/namespace.h" #include "catalog/pg_type.h" #include "catalog/pgxc_node.h" #include "commands/prepare.h" @@ -309,8 +310,10 @@ create_tuple_desc(char *msg_body, size_t len) AttrNumber attnum; char *attname; char *typname; + char *typschema; Oid oidtypeid; int32 typemode, typmod; + List *namelist = NIL; attnum = (AttrNumber) i; @@ -318,8 +321,14 @@ create_tuple_desc(char *msg_body, size_t len) attname = msg_body; msg_body += strlen(attname) + 1; + /* type schema name */ + typschema = msg_body; + namelist = lappend(namelist, makeString(typschema)); + msg_body += strlen(typschema) + 1; + /* type name */ typname = msg_body; + namelist = lappend(namelist, makeString(typname)); msg_body += strlen(typname) + 1; /* table OID, ignored */ @@ -343,7 +352,7 @@ create_tuple_desc(char *msg_body, size_t len) msg_body += 2; /* Get the OID type and mode type from typename */ - parseTypeString(quote_identifier(typname), &oidtypeid, NULL, false); + parseTypeString(NameListToQuotedString(namelist), &oidtypeid, NULL, false); TupleDescInitEntry(result, attnum, attname, oidtypeid, typmod, 0); } diff --git a/src/test/regress/expected/xl_misc.out b/src/test/regress/expected/xl_misc.out new file mode 100644 index 0000000000..6a13035745 --- /dev/null +++ b/src/test/regress/expected/xl_misc.out @@ -0,0 +1,164 @@ +-- try a special column name +create table xltest_type ("primary" integer, b integer); +insert into xltest_type values(1, 11); +insert into xltest_type values(2, 12); +insert into xltest_type values(3, 13); +select count(*) from xltest_type; + count +------- + 3 +(1 row) + +set enable_fast_query_shipping to false; +select count(*) from xltest_type; + count +------- + 3 +(1 row) + +select * from xltest_type order by "primary"; + primary | b +---------+---- + 1 | 11 + 2 | 12 + 3 | 13 +(3 rows) + +drop table xltest_type; +-- repeat with a temp table +set enable_fast_query_shipping to default; +create temp table xltest_type ("primary" integer, b integer); +insert into xltest_type values(1, 11); +insert into xltest_type values(2, 12); +insert into xltest_type values(3, 13); +select count(*) from xltest_type; + count +------- + 3 +(1 row) + +set enable_fast_query_shipping to false; +select count(*) from xltest_type; + count +------- + 3 +(1 row) + +select * from xltest_type order by "primary"; + primary | b +---------+---- + 1 | 11 + 2 | 12 + 3 | 13 +(3 rows) + +drop table xltest_type; +-- try a special table name +set enable_fast_query_shipping to default; +create table "XLTEST_type" ("primary" integer, b integer); +-- fail +insert into xltest_type values(1, 11); +ERROR: relation "xltest_type" does not exist +LINE 1: insert into xltest_type values(1, 11); + ^ +-- fail +insert into XLTEST_type values(1, 11); +ERROR: relation "xltest_type" does not exist +LINE 1: insert into XLTEST_type values(1, 11); + ^ +-- ok +insert into "XLTEST_type" values(1, 11); +insert into "XLTEST_type" values(2, 12); +insert into "XLTEST_type" values(3, 13); +-- fail +select count(*) from XLTEST_type; +ERROR: relation "xltest_type" does not exist +LINE 1: select count(*) from XLTEST_type; + ^ +-- ok +select count(*) from "XLTEST_type"; + count +------- + 3 +(1 row) + +select array_agg(c.*) from "XLTEST_type" c where c.primary = 1; + array_agg +------------ + {"(1,11)"} +(1 row) + +set enable_fast_query_shipping to false; +-- fail +select count(*) from XLTEST_type; +ERROR: relation "xltest_type" does not exist +LINE 1: select count(*) from XLTEST_type; + ^ +-- ok +select count(*) from "XLTEST_type"; + count +------- + 3 +(1 row) + +select array_agg(c.*) from "XLTEST_type" c where c.primary = 1; + array_agg +------------ + {"(1,11)"} +(1 row) + +-- fail +drop table xltest_type; +ERROR: table "xltest_type" does not exist +-- fail +drop table XLTEST_type; +ERROR: table "xltest_type" does not exist +-- fail +drop table "XLTEST_TYPE"; +ERROR: table "XLTEST_TYPE" does not exist +-- ok +drop table "XLTEST_type"; +-- try schema qualification for simple schema name +set enable_fast_query_shipping to default; +create schema xltypeschema; +create table xltypeschema."XLTEST_type" ("primary" integer, b integer); +insert into xltypeschema."XLTEST_type" values(1, 11); +insert into xltypeschema."XLTEST_type" values(2, 12); +insert into xltypeschema."XLTEST_type" values(3, 13); +select array_agg(c.*) from "XLTEST_type" c where c.primary = 1; +ERROR: relation "XLTEST_type" does not exist +LINE 1: select array_agg(c.*) from "XLTEST_type" c where c.primary =... + ^ +select array_agg(c.*) from xltypeschema."XLTEST_type" c where c.primary = 1; + array_agg +------------ + {"(1,11)"} +(1 row) + +drop table xltypeschema."XLTEST_type"; +-- try schema qualification for special schema name +create schema "XL.Schema"; +create table "XL.Schema"."XLTEST_type" ("primary" integer, b integer); +insert into "XL.Schema"."XLTEST_type" values(1, 11); +insert into "XL.Schema"."XLTEST_type" values(2, 12); +insert into "XL.Schema"."XLTEST_type" values(3, 13); +select array_agg(c.*) from "XL.Schema"."XLTEST_type" c where c.primary = 1; + array_agg +------------ + {"(1,11)"} +(1 row) + +-- without schema, fail +select array_agg(c.*) from "XLTEST_type" c; +ERROR: relation "XLTEST_type" does not exist +LINE 1: select array_agg(c.*) from "XLTEST_type" c; + ^ +set search_path = "XL.Schema"; +-- should work +select array_agg(c.*) from "XLTEST_type" c where c.primary = 1; + array_agg +------------ + {"(1,11)"} +(1 row) + +drop table "XL.Schema"."XLTEST_type"; diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index ac09824d43..1bcbf3b5ef 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -150,4 +150,4 @@ test: xc_prepared_xacts test: xc_notrans_block # This runs XL specific tests -test: xl_primary_key xl_foreign_key xl_distribution_column_types xl_alter_table xl_distribution_column_types_modulo xl_plan_pushdown xl_functions xl_limitations xl_user_defined_functions xl_join xl_distributed_xact xl_create_table +test: xl_misc xl_primary_key xl_foreign_key xl_distribution_column_types xl_alter_table xl_distribution_column_types_modulo xl_plan_pushdown xl_functions xl_limitations xl_user_defined_functions xl_join xl_distributed_xact xl_create_table diff --git a/src/test/regress/sql/xl_misc.sql b/src/test/regress/sql/xl_misc.sql new file mode 100644 index 0000000000..3ad64c5b96 --- /dev/null +++ b/src/test/regress/sql/xl_misc.sql @@ -0,0 +1,95 @@ + +-- try a special column name +create table xltest_type ("primary" integer, b integer); +insert into xltest_type values(1, 11); +insert into xltest_type values(2, 12); +insert into xltest_type values(3, 13); + +select count(*) from xltest_type; +set enable_fast_query_shipping to false; +select count(*) from xltest_type; +select * from xltest_type order by "primary"; + +drop table xltest_type; + + +-- repeat with a temp table +set enable_fast_query_shipping to default; +create temp table xltest_type ("primary" integer, b integer); +insert into xltest_type values(1, 11); +insert into xltest_type values(2, 12); +insert into xltest_type values(3, 13); + +select count(*) from xltest_type; +set enable_fast_query_shipping to false; +select count(*) from xltest_type; +select * from xltest_type order by "primary"; + +drop table xltest_type; + + +-- try a special table name +set enable_fast_query_shipping to default; +create table "XLTEST_type" ("primary" integer, b integer); +-- fail +insert into xltest_type values(1, 11); +-- fail +insert into XLTEST_type values(1, 11); +-- ok +insert into "XLTEST_type" values(1, 11); +insert into "XLTEST_type" values(2, 12); +insert into "XLTEST_type" values(3, 13); + +-- fail +select count(*) from XLTEST_type; +-- ok +select count(*) from "XLTEST_type"; +select array_agg(c.*) from "XLTEST_type" c where c.primary = 1; + +set enable_fast_query_shipping to false; +-- fail +select count(*) from XLTEST_type; +-- ok +select count(*) from "XLTEST_type"; + +select array_agg(c.*) from "XLTEST_type" c where c.primary = 1; + +-- fail +drop table xltest_type; +-- fail +drop table XLTEST_type; +-- fail +drop table "XLTEST_TYPE"; +-- ok +drop table "XLTEST_type"; + +-- try schema qualification for simple schema name +set enable_fast_query_shipping to default; +create schema xltypeschema; +create table xltypeschema."XLTEST_type" ("primary" integer, b integer); +insert into xltypeschema."XLTEST_type" values(1, 11); +insert into xltypeschema."XLTEST_type" values(2, 12); +insert into xltypeschema."XLTEST_type" values(3, 13); + +select array_agg(c.*) from "XLTEST_type" c where c.primary = 1; +select array_agg(c.*) from xltypeschema."XLTEST_type" c where c.primary = 1; + +drop table xltypeschema."XLTEST_type"; + +-- try schema qualification for special schema name +create schema "XL.Schema"; +create table "XL.Schema"."XLTEST_type" ("primary" integer, b integer); +insert into "XL.Schema"."XLTEST_type" values(1, 11); +insert into "XL.Schema"."XLTEST_type" values(2, 12); +insert into "XL.Schema"."XLTEST_type" values(3, 13); + +select array_agg(c.*) from "XL.Schema"."XLTEST_type" c where c.primary = 1; + +-- without schema, fail +select array_agg(c.*) from "XLTEST_type" c; +set search_path = "XL.Schema"; +-- should work +select array_agg(c.*) from "XLTEST_type" c where c.primary = 1; + +drop table "XL.Schema"."XLTEST_type"; + |