diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index c95baad4175959d73ed6c29a3def39a4b01dac87..9a29b645aae843dda0964acd0acf8fe59c9049a5 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_table.sgml,v 1.67 2003/04/22 10:08:08 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_table.sgml,v 1.68 2003/05/04 00:03:55 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -16,7 +16,7 @@ PostgreSQL documentation
 
  <refsynopsisdiv>
 <synopsis>
-CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PARAMETER">table_name</replaceable> (
+CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PARAMETER">table_name</replaceable> (
     { <replaceable class="PARAMETER">column_name</replaceable> <replaceable class="PARAMETER">data_type</replaceable> [ DEFAULT <replaceable>default_expr</> ] [ <replaceable class="PARAMETER">column_constraint</replaceable> [, ... ] ]
     | <replaceable>table_constraint</replaceable> }  [, ... ]
 )
@@ -101,7 +101,7 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is:
   <variablelist>
 
    <varlistentry>
-    <term><literal>[LOCAL] TEMPORARY</> or <literal>[LOCAL] TEMP</></term>
+    <term><literal>TEMPORARY</> or <literal>TEMP</></term>
     <listitem>
      <para>
       If specified, the table is created as a temporary table.
@@ -115,7 +115,9 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is:
      </para>
 
      <para>
-      The <literal>LOCAL</literal> word is optional.  But see under
+      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
       <xref linkend="sql-createtable-compatibility"
       endterm="sql-createtable-compatibility-title">.
      </para>
@@ -195,7 +197,7 @@ and <replaceable class="PARAMETER">table_constraint</replaceable> is:
      </para>
 <!--
      <para>
-      <application>PostgreSQL</application> automatically allows the
+      <productname>PostgreSQL</> automatically allows the
      created table to inherit
       functions on tables above it in the inheritance hierarchy; that
       is, if we create table <literal>foo</literal> inheriting from
@@ -786,7 +788,8 @@ CREATE TABLE distributors (
 
    <para>
     Although the syntax of <literal>CREATE TEMPORARY TABLE</literal>
-    resembles that of SQL standard, the effect is not the same.  In the standard,
+    resembles that of the SQL standard, the effect is not the same.  In the
+    standard, 
     temporary tables are defined just once and automatically exist (starting
     with empty contents) in every session that needs them.
     <productname>PostgreSQL</productname> instead
@@ -798,7 +801,7 @@ CREATE TABLE distributors (
    </para>
 
    <para>
-    The behavior of temporary tables mandated by the standard is
+    The standard's definition of the behavior of temporary tables is
     widely ignored.  <productname>PostgreSQL</productname>'s behavior
     on this point is similar to that of several other SQL databases.
    </para>
@@ -808,6 +811,9 @@ CREATE TABLE distributors (
     is not in <productname>PostgreSQL</productname>, since that distinction
     depends on the concept of modules, which
     <productname>PostgreSQL</productname> does not have.
+    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.
    </para>
 
    <para>
diff --git a/doc/src/sgml/ref/create_table_as.sgml b/doc/src/sgml/ref/create_table_as.sgml
index cc30ce0e3f72df753ccf4ecaa060257da3020458..d298e1a5ea1d622d83d0ad2238520413b843c6b3 100644
--- a/doc/src/sgml/ref/create_table_as.sgml
+++ b/doc/src/sgml/ref/create_table_as.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_table_as.sgml,v 1.12 2003/04/22 10:08:08 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_table_as.sgml,v 1.13 2003/05/04 00:03:55 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -16,7 +16,7 @@ PostgreSQL documentation
 
  <refsynopsisdiv>
 <synopsis>
-CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name</replaceable> [ (<replaceable>column_name</replaceable> [, ...] ) ]
+CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name</replaceable> [ (<replaceable>column_name</replaceable> [, ...] ) ]
     AS <replaceable>query</replaceable>
 </synopsis>
  </refsynopsisdiv>
@@ -49,7 +49,7 @@ CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name</replace
    
   <variablelist>
    <varlistentry>
-    <term><literal>[LOCAL] TEMPORARY</> or <literal>[LOCAL] TEMP</></term>
+    <term><literal>TEMPORARY</> or <literal>TEMP</></term>
     <listitem>
      <para>
       If specified, the table is created as a temporary table.
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index bd67dae811f720193c4dd6264f8b131011880015..4f8b0b10fc9a54a04b67c19b950469d37a7e9490 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.412 2003/04/29 03:21:29 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.413 2003/05/04 00:03:55 tgl Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -964,10 +964,17 @@ zone_value:
 			| ConstInterval '(' Iconst ')' Sconst opt_interval
 				{
 					A_Const *n = (A_Const *) makeStringConst($5, $1);
-					if (($3 < 0) || ($3 > MAX_INTERVAL_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-							"INTERVAL(%d) precision must be between %d and %d",
-							$3, 0, MAX_INTERVAL_PRECISION);
+							 "INTERVAL(%d) precision must not be negative",
+							 $3);
+					if ($3 > MAX_INTERVAL_PRECISION)
+					{
+						elog(NOTICE,
+							 "INTERVAL(%d) precision reduced to maximum allowed, %d",
+							 $3, MAX_INTERVAL_PRECISION);
+						$3 = MAX_INTERVAL_PRECISION;
+					}
 
 					if (($6 != INTERVAL_FULL_RANGE)
 						&& (($6 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0))
@@ -1414,23 +1421,16 @@ 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.
  */
 OptTemp:	TEMPORARY						{ $$ = TRUE; }
 			| TEMP							{ $$ = TRUE; }
 			| LOCAL TEMPORARY				{ $$ = TRUE; }
 			| LOCAL TEMP					{ $$ = TRUE; }
-			| GLOBAL TEMPORARY
-				{
-					elog(ERROR,
-					"GLOBAL TEMPORARY TABLE is not currently supported");
-					$$ = TRUE;
-				}
-			| GLOBAL TEMP
-				{
-					elog(ERROR,
-					"GLOBAL TEMPORARY TABLE is not currently supported");
-					$$ = TRUE;
-				}
+			| GLOBAL TEMPORARY				{ $$ = TRUE; }
+			| GLOBAL TEMP					{ $$ = TRUE; }
 			| /*EMPTY*/						{ $$ = FALSE; }
 		;
 
@@ -1466,8 +1466,8 @@ columnDef:	ColId Typename ColQualList opt_collate
 
 					if ($4 != NULL)
 						elog(NOTICE,
-							"CREATE TABLE / COLLATE %s not yet implemented; "
-							"clause ignored", $4);
+							 "CREATE TABLE / COLLATE %s not yet implemented; "
+							 "clause ignored", $4);
 
 					$$ = (Node *)n;
 				}
@@ -3240,7 +3240,7 @@ RemoveOperStmt:
 oper_argtypes:
 			Typename
 				{
-				   elog(ERROR,"parser: argument type missing (use NONE for unary operators)");
+				   elog(ERROR, "parser: argument type missing (use NONE for unary operators)");
 				}
 			| Typename ',' Typename
 					{ $$ = makeList2($1, $3); }
@@ -3768,7 +3768,7 @@ CreateDomainStmt:
 
 					if ($7 != NULL)
 						elog(NOTICE,"CREATE DOMAIN / COLLATE %s not yet "
-							"implemented; clause ignored", $7);
+							 "implemented; clause ignored", $7);
 					$$ = (Node *)n;
 				}
 		;
@@ -4426,15 +4426,11 @@ OptTempTableName:
 				}
 			| GLOBAL TEMPORARY opt_table qualified_name
 				{
-					elog(ERROR,
-						"GLOBAL TEMPORARY TABLE is not currently supported");
 					$$ = $4;
 					$$->istemp = true;
 				}
 			| GLOBAL TEMP opt_table qualified_name
 				{
-					elog(ERROR,
-						"GLOBAL TEMPORARY TABLE is not currently supported");
 					$$ = $4;
 					$$->istemp = true;
 				}
@@ -5031,10 +5027,17 @@ SimpleTypename:
 			| ConstInterval '(' Iconst ')' opt_interval
 				{
 					$$ = $1;
-					if (($3 < 0) || ($3 > MAX_INTERVAL_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-						"INTERVAL(%d) precision must be between %d and %d",
-							 $3, 0, MAX_INTERVAL_PRECISION);
+							 "INTERVAL(%d) precision must not be negative",
+							 $3);
+					if ($3 > MAX_INTERVAL_PRECISION)
+					{
+						elog(NOTICE,
+							 "INTERVAL(%d) precision reduced to maximum allowed, %d",
+							 $3, MAX_INTERVAL_PRECISION);
+						$3 = MAX_INTERVAL_PRECISION;
+					}
 					$$->typmod = INTERVAL_TYPMOD($3, $5);
 				}
 			| type_name attrs
@@ -5390,11 +5393,18 @@ ConstDatetime:
 					 * - thomas 2001-09-06
 					 */
 					$$->timezone = $5;
-					if (($3 < 0) || ($3 > MAX_TIMESTAMP_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-						"TIMESTAMP(%d)%s precision must be between %d and %d",
-							 $3, ($5 ? " WITH TIME ZONE": ""), 0,
+							 "TIMESTAMP(%d)%s precision must not be negative",
+							 $3, ($5 ? " WITH TIME ZONE": ""));
+					if ($3 > MAX_TIMESTAMP_PRECISION)
+					{
+						elog(NOTICE,
+							 "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d",
+							 $3, ($5 ? " WITH TIME ZONE": ""),
 							 MAX_TIMESTAMP_PRECISION);
+						$3 = MAX_TIMESTAMP_PRECISION;
+					}
 					$$->typmod = $3;
 				}
 			| TIMESTAMP opt_timezone
@@ -5422,11 +5432,18 @@ ConstDatetime:
 						$$ = SystemTypeName("timetz");
 					else
 						$$ = SystemTypeName("time");
-					if (($3 < 0) || ($3 > MAX_TIME_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-						"TIME(%d)%s precision must be between %d and %d",
-							 $3, ($5 ? " WITH TIME ZONE": ""), 0,
+							 "TIME(%d)%s precision must not be negative",
+							 $3, ($5 ? " WITH TIME ZONE": ""));
+					if ($3 > MAX_TIME_PRECISION)
+					{
+						elog(NOTICE,
+							 "TIME(%d)%s precision reduced to maximum allowed, %d",
+							 $3, ($5 ? " WITH TIME ZONE": ""),
 							 MAX_TIME_PRECISION);
+						$3 = MAX_TIME_PRECISION;
+					}
 					$$->typmod = $3;
 				}
 			| TIME opt_timezone
@@ -6218,10 +6235,17 @@ c_expr:		columnref								{ $$ = (Node *) $1; }
 					s->val.val.str = "now";
 					s->typename = SystemTypeName("text");
 					d = SystemTypeName("timetz");
-					if (($3 < 0) || ($3 > MAX_TIME_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-						"CURRENT_TIME(%d) precision must be between %d and %d",
-							 $3, 0, MAX_TIME_PRECISION);
+							 "CURRENT_TIME(%d) precision must not be negative",
+							 $3);
+					if ($3 > MAX_TIME_PRECISION)
+					{
+						elog(NOTICE,
+							 "CURRENT_TIME(%d) precision reduced to maximum allowed, %d",
+							 $3, MAX_TIME_PRECISION);
+						$3 = MAX_TIME_PRECISION;
+					}
 					d->typmod = $3;
 
 					$$ = (Node *)makeTypeCast((Node *)s, d);
@@ -6263,11 +6287,17 @@ c_expr:		columnref								{ $$ = (Node *) $1; }
 					s->typename = SystemTypeName("text");
 
 					d = SystemTypeName("timestamptz");
-					if (($3 < 0) || ($3 > MAX_TIMESTAMP_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-						"CURRENT_TIMESTAMP(%d) precision "
-						"must be between %d and %d",
-							 $3, 0, MAX_TIMESTAMP_PRECISION);
+							 "CURRENT_TIMESTAMP(%d) precision must not be negative",
+							 $3);
+					if ($3 > MAX_TIMESTAMP_PRECISION)
+					{
+						elog(NOTICE,
+							 "CURRENT_TIMESTAMP(%d) precision reduced to maximum allowed, %d",
+							 $3, MAX_TIMESTAMP_PRECISION);
+						$3 = MAX_TIMESTAMP_PRECISION;
+					}
 					d->typmod = $3;
 
 					$$ = (Node *)makeTypeCast((Node *)s, d);
@@ -6308,10 +6338,17 @@ c_expr:		columnref								{ $$ = (Node *) $1; }
 					s->val.val.str = "now";
 					s->typename = SystemTypeName("text");
 					d = SystemTypeName("time");
-					if (($3 < 0) || ($3 > MAX_TIME_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-						"LOCALTIME(%d) precision must be between %d and %d",
-							 $3, 0, MAX_TIME_PRECISION);
+							 "LOCALTIME(%d) precision must not be negative",
+							 $3);
+					if ($3 > MAX_TIME_PRECISION)
+					{
+						elog(NOTICE,
+							 "LOCALTIME(%d) precision reduced to maximum allowed, %d",
+							 $3, MAX_TIME_PRECISION);
+						$3 = MAX_TIME_PRECISION;
+					}
 					d->typmod = $3;
 
 					$$ = (Node *)makeTypeCast((Node *)s, d);
@@ -6353,11 +6390,17 @@ c_expr:		columnref								{ $$ = (Node *) $1; }
 					s->typename = SystemTypeName("text");
 
 					d = SystemTypeName("timestamp");
-					if (($3 < 0) || ($3 > MAX_TIMESTAMP_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-						"LOCALTIMESTAMP(%d) precision must be "
-						"between %d and %d",
-							 $3, 0, MAX_TIMESTAMP_PRECISION);
+							 "LOCALTIMESTAMP(%d) precision must not be negative",
+							 $3);
+					if ($3 > MAX_TIMESTAMP_PRECISION)
+					{
+						elog(NOTICE,
+							 "LOCALTIMESTAMP(%d) precision reduced to maximum allowed, %d",
+							 $3, MAX_TIMESTAMP_PRECISION);
+						$3 = MAX_TIMESTAMP_PRECISION;
+					}
 					d->typmod = $3;
 
 					$$ = (Node *)makeTypeCast((Node *)s, d);
@@ -6934,8 +6977,8 @@ qualified_name:
 							break;
 						default:
 							elog(ERROR,
-							"Improper qualified name "
-							"(too many dotted names): %s",
+								 "Improper qualified name "
+								 "(too many dotted names): %s",
 								 NameListToString($1));
 							break;
 					}
@@ -7038,10 +7081,17 @@ AexprConst: Iconst
 					n->val.type = T_String;
 					n->val.val.str = $5;
 					/* precision specified, and fields may be... */
-					if (($3 < 0) || ($3 > MAX_INTERVAL_PRECISION))
+					if ($3 < 0)
 						elog(ERROR,
-						"INTERVAL(%d) precision must be between %d and %d",
-							 $3, 0, MAX_INTERVAL_PRECISION);
+							 "INTERVAL(%d) precision must not be negative",
+							 $3);
+					if ($3 > MAX_INTERVAL_PRECISION)
+					{
+						elog(NOTICE,
+							"INTERVAL(%d) precision reduced to maximum allowed, %d",
+							$3, MAX_INTERVAL_PRECISION);
+						$3 = MAX_INTERVAL_PRECISION;
+					}
 					n->typename->typmod = INTERVAL_TYPMOD($3, $6);
 					$$ = (Node *)n;
 				}