From 0fec77ae88ea17555001dd7d6de16db27f742cbe Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 27 Oct 2008 09:37:47 +0000 Subject: [PATCH] SQL:2008 syntax CURRENT_CATALOG, CURRENT_SCHEMA, SET CATALOG, SET SCHEMA. --- doc/src/sgml/func.sgml | 26 +++++++++++---- doc/src/sgml/ref/set.sgml | 13 +++++++- src/backend/catalog/sql_features.txt | 4 +-- src/backend/parser/gram.y | 48 +++++++++++++++++++++++++-- src/backend/parser/keywords.c | 5 ++- src/interfaces/ecpg/preproc/preproc.y | 17 ++++++++-- 6 files changed, 97 insertions(+), 16 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 06ee6a0572f..df6045fc70e 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,4 +1,4 @@ - + Functions and Operators @@ -3184,7 +3184,8 @@ cast(-44 as bit(12)) 111111010100 function fails and returns null. To indicate the part of the pattern that should be returned on success, the pattern must contain two occurrences of the escape character followed by a double quote - ("). The text matching the portion of the pattern + ("). + The text matching the portion of the pattern between these markers is returned. @@ -10932,6 +10933,12 @@ postgres=# select * from unnest2(array[[1,2],[3,4]]); + + current_catalog + name + name of current database (called catalog in the SQL standard) + + current_database() name @@ -10939,7 +10946,7 @@ postgres=# select * from unnest2(array[[1,2],[3,4]]); - current_schema() + current_schema[()] name name of current schema @@ -11055,6 +11062,10 @@ postgres=# select * from unnest2(array[[1,2],[3,4]]); current + + current_catalog + + current_database @@ -11083,9 +11094,12 @@ postgres=# select * from unnest2(array[[1,2],[3,4]]); - current_user, session_user, and - user have special syntactic status in SQL: - they must be called without trailing parentheses. + current_catalog, current_schema, + current_user, session_user, + and user have special syntactic status + in SQL: they must be called without trailing + parentheses (optional in PostgreSQL in the case + of current_schema). diff --git a/doc/src/sgml/ref/set.sgml b/doc/src/sgml/ref/set.sgml index a31d1540526..9174d52decb 100644 --- a/doc/src/sgml/ref/set.sgml +++ b/doc/src/sgml/ref/set.sgml @@ -1,5 +1,5 @@ @@ -150,6 +150,17 @@ SET [ SESSION | LOCAL ] TIME ZONE { timezone + + SCHEMA + + + SET SCHEMA 'value' is an alias for + SET search_path TO value. Only one + schema can be specified using this syntax. + + + + NAMES diff --git a/src/backend/catalog/sql_features.txt b/src/backend/catalog/sql_features.txt index fdd393e7fef..be9974af271 100644 --- a/src/backend/catalog/sql_features.txt +++ b/src/backend/catalog/sql_features.txt @@ -295,8 +295,8 @@ F731 INSERT column privileges NO F741 Referential MATCH types NO no partial match yet F751 View CHECK enhancements NO F761 Session management YES -F762 CURRENT_CATALOG NO same as current_database() -F763 CURRENT_SCHEMA NO same as current_schema() +F762 CURRENT_CATALOG YES +F763 CURRENT_SCHEMA YES F771 Connection management YES F781 Self-referencing operations YES F791 Insensitive cursors YES diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 172d45933e4..6a566fd400f 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.629 2008/10/27 08:47:14 petere Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.630 2008/10/27 09:37:47 petere Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -401,12 +401,13 @@ static TypeName *TableFuncTypeName(List *columns); BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT BOOLEAN_P BOTH BY - CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P + CACHE CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CREATEDB - CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P CURRENT_DATE CURRENT_ROLE + CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P + CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS @@ -1133,6 +1134,22 @@ set_rest: /* Generic SET syntaxes: */ n->args = $5; $$ = n; } + | CATALOG_P Sconst + { + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("current database cannot be changed"), + scanner_errposition(@2))); + $$ = NULL; /*not reached*/ + } + | SCHEMA Sconst + { + VariableSetStmt *n = makeNode(VariableSetStmt); + n->kind = VAR_SET_VALUE; + n->name = "search_path"; + n->args = list_make1(makeStringConst($2, @2)); + $$ = n; + } | NAMES opt_encoding { VariableSetStmt *n = makeNode(VariableSetStmt); @@ -8401,6 +8418,28 @@ func_expr: func_name '(' ')' n->location = @1; $$ = (Node *)n; } + | CURRENT_CATALOG + { + FuncCall *n = makeNode(FuncCall); + n->funcname = SystemFuncName("current_database"); + n->args = NIL; + n->agg_star = FALSE; + n->agg_distinct = FALSE; + n->func_variadic = FALSE; + n->location = @1; + $$ = (Node *)n; + } + | CURRENT_SCHEMA + { + FuncCall *n = makeNode(FuncCall); + n->funcname = SystemFuncName("current_schema"); + n->args = NIL; + n->agg_star = FALSE; + n->agg_distinct = FALSE; + n->func_variadic = FALSE; + n->location = @1; + $$ = (Node *)n; + } | CAST '(' a_expr AS Typename ')' { $$ = makeTypeCast($3, $5, @1); } | EXTRACT '(' extract_list ')' @@ -9336,6 +9375,7 @@ unreserved_keyword: | CALLED | CASCADE | CASCADED + | CATALOG_P | CHAIN | CHARACTERISTICS | CHECKPOINT @@ -9625,6 +9665,7 @@ type_func_name_keyword: | BETWEEN | BINARY | CROSS + | CURRENT_SCHEMA | FREEZE | FULL | ILIKE @@ -9667,6 +9708,7 @@ reserved_keyword: | COLUMN | CONSTRAINT | CREATE + | CURRENT_CATALOG | CURRENT_DATE | CURRENT_ROLE | CURRENT_TIME diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index 608e80e0f5d..9eb6d082269 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.204 2008/10/22 11:00:34 petere Exp $ + * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.205 2008/10/27 09:37:47 petere Exp $ * *------------------------------------------------------------------------- */ @@ -83,6 +83,7 @@ const ScanKeyword ScanKeywords[] = { {"cascaded", CASCADED, UNRESERVED_KEYWORD}, {"case", CASE, RESERVED_KEYWORD}, {"cast", CAST, RESERVED_KEYWORD}, + {"catalog", CATALOG_P, UNRESERVED_KEYWORD}, {"chain", CHAIN, UNRESERVED_KEYWORD}, {"char", CHAR_P, COL_NAME_KEYWORD}, {"character", CHARACTER, COL_NAME_KEYWORD}, @@ -116,8 +117,10 @@ const ScanKeyword ScanKeywords[] = { {"csv", CSV, UNRESERVED_KEYWORD}, {"ctype", CTYPE, UNRESERVED_KEYWORD}, {"current", CURRENT_P, UNRESERVED_KEYWORD}, + {"current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD}, {"current_date", CURRENT_DATE, RESERVED_KEYWORD}, {"current_role", CURRENT_ROLE, RESERVED_KEYWORD}, + {"current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD}, {"current_time", CURRENT_TIME, RESERVED_KEYWORD}, {"current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD}, {"current_user", CURRENT_USER, RESERVED_KEYWORD}, diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 7220deff68a..038942da291 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.377 2008/10/21 08:38:16 petere Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.378 2008/10/27 09:37:47 petere Exp $ */ /* Copyright comment */ %{ @@ -423,12 +423,13 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT BOOLEAN_P BOTH BY - CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P + CACHE CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CREATEDB - CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P CURRENT_DATE CURRENT_ROLE + CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P + CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS @@ -1217,6 +1218,10 @@ set_rest: /* Generic SET syntaxes: */ { $$ = cat2_str(make_str("transaction"), $2); } | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list { $$ = cat2_str(make_str("session characteristics as transaction"), $5); } + | CATALOG_P Sconst + { $$ = cat2_str(make_str("catalog"), $2); } + | SCHEMA Sconst + { $$ = cat2_str(make_str("schema"), $2); } | NAMES opt_encoding { $$ = cat2_str(make_str("names"), $2); } | ROLE ColId_or_Sconst @@ -4469,6 +4474,10 @@ func_expr: func_name '(' ')' { $$ = make_str("session_user"); } | USER { $$ = make_str("user"); } + | CURRENT_CATALOG + { $$ = make_str("current_catalog"); } + | CURRENT_SCHEMA + { $$ = make_str("current_schema"); } | CAST '(' a_expr AS Typename ')' { $$ = cat_str(5, make_str("cast("), $3, make_str("as"), $5, make_str(")")); } | EXTRACT '(' extract_list ')' @@ -6867,10 +6876,12 @@ reserved_keyword: | CONSTRAINT { $$ = make_str("constraint"); } | CREATE { $$ = make_str("create"); } | CURRENT_P { $$ = make_str("current"); } + | CURRENT_CATALOG { $$ = make_str("current_catalog"); } | CURRENT_DATE { $$ = make_str("current_date"); } | CURRENT_TIME { $$ = make_str("current_time"); } | CURRENT_TIMESTAMP { $$ = make_str("current_timestamp"); } | CURRENT_ROLE { $$ = make_str("current_role"); } + | CURRENT_SCHEMA { $$ = make_str("current_schema"); } | CURRENT_USER { $$ = make_str("current_user"); } | DEFAULT { $$ = make_str("default"); } | DEFERRABLE { $$ = make_str("deferrable"); } -- 2.39.5