diff options
-rw-r--r-- | doc/src/sgml/ref/create_table.sgml | 20 | ||||
-rw-r--r-- | doc/src/sgml/ref/create_table_as.sgml | 5 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 30 |
3 files changed, 42 insertions, 13 deletions
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml index a52bfad2f3d..d329388bb9a 100644 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -163,7 +163,8 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI <para> Optionally, <literal>GLOBAL</literal> or <literal>LOCAL</literal> can be written before <literal>TEMPORARY</> or <literal>TEMP</>. - This makes no difference in <productname>PostgreSQL</>, but see + This presently makes no difference in <productname>PostgreSQL</> + and is deprecated; see <xref linkend="sql-createtable-compatibility" endterm="sql-createtable-compatibility-title">. </para> @@ -1304,13 +1305,20 @@ CREATE TABLE employees OF employee_type ( </para> <para> - The standard's distinction between global and local temporary tables - is not in <productname>PostgreSQL</productname>, since that distinction - depends on the concept of modules, which - <productname>PostgreSQL</productname> does not have. + The SQL standard also distinguishes between global and local temporary + tables, where a local temporary table is only visible within a specific + SQL module, though its definition is still shared across sessions. Since + <productname>PostgreSQL</productname> does not support SQL modules, this + distinction is not relevant in <productname>PostgreSQL</productname>. + </para> + + <para> For compatibility's sake, <productname>PostgreSQL</productname> will accept the <literal>GLOBAL</literal> and <literal>LOCAL</literal> keywords - in a temporary table declaration, but they have no effect. + in a temporary table declaration, but they currently have no effect. + Use of these keywords is discouraged, since future versions of + <productname>PostgreSQL</productname> might adopt a more + standard-compliant interpretation of their meaning. </para> <para> diff --git a/doc/src/sgml/ref/create_table_as.sgml b/doc/src/sgml/ref/create_table_as.sgml index 1be9f4d1f6a..29d161940c7 100644 --- a/doc/src/sgml/ref/create_table_as.sgml +++ b/doc/src/sgml/ref/create_table_as.sgml @@ -62,9 +62,8 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE <replaceable <term><literal>GLOBAL</literal> or <literal>LOCAL</literal></term> <listitem> <para> - Ignored for compatibility. Refer to <xref - linkend="sql-createtable"> for - details. + Ignored for compatibility. Use of these keywords is deprecated; + refer to <xref linkend="sql-createtable"> for details. </para> </listitem> </varlistentry> diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 9eb1bed58e6..8389337ecc2 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -2507,15 +2507,31 @@ CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' * Redundancy here is needed to avoid shift/reduce conflicts, * since TEMP is not a reserved word. See also OptTempTableName. * - * NOTE: we accept both GLOBAL and LOCAL options; since we have no modules - * the LOCAL keyword is really meaningless. + * NOTE: we accept both GLOBAL and LOCAL options. They currently do nothing, + * but future versions might consider GLOBAL to request SQL-spec-compliant + * temp table behavior, so warn about that. Since we have no modules the + * LOCAL keyword is really meaningless; furthermore, some other products + * implement LOCAL as meaning the same as our default temp table behavior, + * so we'll probably continue to treat LOCAL as a noise word. */ OptTemp: TEMPORARY { $$ = RELPERSISTENCE_TEMP; } | TEMP { $$ = RELPERSISTENCE_TEMP; } | LOCAL TEMPORARY { $$ = RELPERSISTENCE_TEMP; } | LOCAL TEMP { $$ = RELPERSISTENCE_TEMP; } - | GLOBAL TEMPORARY { $$ = RELPERSISTENCE_TEMP; } - | GLOBAL TEMP { $$ = RELPERSISTENCE_TEMP; } + | GLOBAL TEMPORARY + { + ereport(WARNING, + (errmsg("GLOBAL is deprecated in temporary table creation"), + parser_errposition(@1))); + $$ = RELPERSISTENCE_TEMP; + } + | GLOBAL TEMP + { + ereport(WARNING, + (errmsg("GLOBAL is deprecated in temporary table creation"), + parser_errposition(@1))); + $$ = RELPERSISTENCE_TEMP; + } | UNLOGGED { $$ = RELPERSISTENCE_UNLOGGED; } | /*EMPTY*/ { $$ = RELPERSISTENCE_PERMANENT; } ; @@ -8930,11 +8946,17 @@ OptTempTableName: } | GLOBAL TEMPORARY opt_table qualified_name { + ereport(WARNING, + (errmsg("GLOBAL is deprecated in temporary table creation"), + parser_errposition(@1))); $$ = $4; $$->relpersistence = RELPERSISTENCE_TEMP; } | GLOBAL TEMP opt_table qualified_name { + ereport(WARNING, + (errmsg("GLOBAL is deprecated in temporary table creation"), + parser_errposition(@1))); $$ = $4; $$->relpersistence = RELPERSISTENCE_TEMP; } |