From c3bc76bdb0ac600e6b4d1e594e1a077c1efc5154 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 13 Jun 2012 17:48:42 -0400 Subject: [PATCH] Deprecate use of GLOBAL and LOCAL in temp table creation. Aside from adjusting the documentation to say that these are deprecated, we now report a warning (not an error) for use of GLOBAL, since it seems fairly likely that we might change that to request SQL-spec-compliant temp table behavior in the foreseeable future. Although our handling of LOCAL is equally nonstandard, there is no evident interest in ever implementing SQL modules, and furthermore some other products interpret LOCAL as behaving the same way we do. So no expectation of change and no warning for LOCAL; but it still seems a good idea to deprecate writing it. Noah Misch --- doc/src/sgml/ref/create_table.sgml | 20 ++++++++++++------ doc/src/sgml/ref/create_table_as.sgml | 5 ++--- 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 a52bfad2f3..d329388bb9 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 Optionally, GLOBAL or LOCAL can be written before TEMPORARY or TEMP. - This makes no difference in PostgreSQL, but see + This presently makes no difference in PostgreSQL + and is deprecated; see . @@ -1304,13 +1305,20 @@ CREATE TABLE employees OF employee_type ( - The standard's distinction between global and local temporary tables - is not in PostgreSQL, since that distinction - depends on the concept of modules, which - PostgreSQL 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 + PostgreSQL does not support SQL modules, this + distinction is not relevant in PostgreSQL. + + + For compatibility's sake, PostgreSQL will accept the GLOBAL and LOCAL 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 + PostgreSQL might adopt a more + standard-compliant interpretation of their meaning. diff --git a/doc/src/sgml/ref/create_table_as.sgml b/doc/src/sgml/ref/create_table_as.sgml index 1be9f4d1f6..29d161940c 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 GLOBAL or LOCAL - Ignored for compatibility. Refer to for - details. + Ignored for compatibility. Use of these keywords is deprecated; + refer to for details. diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 9eb1bed58e..8389337ecc 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; } -- 2.39.5