SQL:2008 CURRENT_CATALOG and CURRENT_SCHEMA

Поиск
Список
Период
Сортировка
От Peter Eisentraut
Тема SQL:2008 CURRENT_CATALOG and CURRENT_SCHEMA
Дата
Msg-id 48FF3573.7020500@gmx.net
обсуждение исходный текст
Список pgsql-hackers
Here is another patch for relatively redundant SQL:2008 functionality.
They standardized in CURRENT_CATALOG and CURRENT_SCHEMA (without
parentheses, as usual) for what we have as current_database() and
current_schema().  They also added SET CATALOG and SET SCHEMA.  SET
CATALOG won't work in PostgreSQL, and SET SCHEMA is a subset of SET
search_path.
diff -ur ../cvs-pgsql/doc/src/sgml/func.sgml ./doc/src/sgml/func.sgml
--- ../cvs-pgsql/doc/src/sgml/func.sgml    2008-10-15 14:19:37.000000000 +0300
+++ ./doc/src/sgml/func.sgml    2008-10-22 17:04:56.000000000 +0300
@@ -3184,7 +3184,8 @@
     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
-    (<literal>"</>).  The text matching the portion of the pattern
+    (<literal>"</>). <!-- " font-lock sanity -->
+    The text matching the portion of the pattern
     between these markers is returned.
    </para>

@@ -10933,13 +10934,19 @@

      <tbody>
       <row>
+       <entry><literal><function>current_catalog</function></literal></entry>
+       <entry><type>name</type></entry>
+       <entry>name of current database (called <quote>catalog</quote> in the SQL standard)</entry>
+      </row>
+
+      <row>
        <entry><literal><function>current_database</function>()</literal></entry>
        <entry><type>name</type></entry>
        <entry>name of current database</entry>
       </row>

       <row>
-       <entry><literal><function>current_schema</function>()</literal></entry>
+       <entry><literal><function>current_schema</function>[()]</literal></entry>
        <entry><type>name</type></entry>
        <entry>name of current schema</entry>
       </row>
@@ -11056,6 +11063,10 @@
    </indexterm>

    <indexterm>
+    <primary>current_catalog</primary>
+   </indexterm>
+
+   <indexterm>
     <primary>current_database</primary>
    </indexterm>

@@ -11083,9 +11094,12 @@

    <note>
     <para>
-     <function>current_user</function>, <function>session_user</function>, and
-     <function>user</function> have special syntactic status in <acronym>SQL</acronym>:
-     they must be called without trailing parentheses.
+     <function>current_catalog</function>, <function>current_schema</function>,
+     <function>current_user</function>, <function>session_user</function>,
+     and <function>user</function> have special syntactic status
+     in <acronym>SQL</acronym>: they must be called without trailing
+     parentheses (optional in PostgreSQL in the case
+     of <function>current_schema</function>).
     </para>
    </note>

diff -ur ../cvs-pgsql/doc/src/sgml/ref/set.sgml ./doc/src/sgml/ref/set.sgml
--- ../cvs-pgsql/doc/src/sgml/ref/set.sgml    2008-03-10 14:39:22.000000000 +0200
+++ ./doc/src/sgml/ref/set.sgml    2008-10-22 16:58:05.000000000 +0300
@@ -151,6 +151,17 @@

    <variablelist>
     <varlistentry>
+     <term><literal>SCHEMA</literal></term>
+     <listitem>
+      <para>
+       <literal>SET SCHEMA '<replaceable>value</>'</> is an alias for
+       <literal>SET search_path TO <replaceable>value</></>.  Only one
+       schema can be specified using this syntax.
+      </para>
+     </listitem>
+    </varlistentry>
+
+    <varlistentry>
      <term><literal>NAMES</literal></term>
      <listitem>
       <para>
diff -ur ../cvs-pgsql/src/backend/parser/gram.y ./src/backend/parser/gram.y
--- ../cvs-pgsql/src/backend/parser/gram.y    2008-10-22 14:35:44.000000000 +0300
+++ ./src/backend/parser/gram.y    2008-10-22 16:57:10.000000000 +0300
@@ -401,12 +401,13 @@
     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 @@
                     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);
@@ -8400,6 +8417,28 @@
                     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 ')'
@@ -9335,6 +9374,7 @@
             | CALLED
             | CASCADE
             | CASCADED
+            | CATALOG_P
             | CHAIN
             | CHARACTERISTICS
             | CHECKPOINT
@@ -9624,6 +9664,7 @@
             | BETWEEN
             | BINARY
             | CROSS
+            | CURRENT_SCHEMA
             | FREEZE
             | FULL
             | ILIKE
@@ -9666,6 +9707,7 @@
             | COLUMN
             | CONSTRAINT
             | CREATE
+            | CURRENT_CATALOG
             | CURRENT_DATE
             | CURRENT_ROLE
             | CURRENT_TIME
diff -ur ../cvs-pgsql/src/backend/parser/keywords.c ./src/backend/parser/keywords.c
--- ../cvs-pgsql/src/backend/parser/keywords.c    2008-10-22 14:35:44.000000000 +0300
+++ ./src/backend/parser/keywords.c    2008-10-22 15:31:54.000000000 +0300
@@ -83,6 +83,7 @@
     {"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 @@
     {"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 -ur ../cvs-pgsql/src/interfaces/ecpg/preproc/preproc.y ./src/interfaces/ecpg/preproc/preproc.y
--- ../cvs-pgsql/src/interfaces/ecpg/preproc/preproc.y    2008-10-21 11:48:33.000000000 +0300
+++ ./src/interfaces/ecpg/preproc/preproc.y    2008-10-22 16:54:54.000000000 +0300
@@ -423,12 +423,13 @@
     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 @@
             { $$ = 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 @@
             { $$ = 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 @@
         | 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"); }

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Simon Riggs
Дата:
Сообщение: Re: Bitmap Indexes: request for feedback
Следующее
От: Heikki Linnakangas
Дата:
Сообщение: Re: Deriving Recovery Snapshots