summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorTom Lane2000-11-14 18:37:49 +0000
committerTom Lane2000-11-14 18:37:49 +0000
commit2cf48ca04bf59985117e04dd71644a507be90dbb (patch)
tree6b1033da07f1805a79bcfb67345aba778559d74e /src/backend/parser
parent8a9315ca92804bd32b3ee864bf83d98840e1a947 (diff)
Extend CREATE DATABASE to allow selection of a template database to be
cloned, rather than always cloning template1. Modify initdb to generate two identical databases rather than one, template0 and template1. Connections to template0 are disallowed, so that it will always remain in its virgin as-initdb'd state. pg_dumpall now dumps databases with restore commands that say CREATE DATABASE foo WITH TEMPLATE = template0. This allows proper behavior when there is user-added data in template1. initdb forced!
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y97
-rw-r--r--src/backend/parser/keywords.c3
2 files changed, 70 insertions, 30 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 5572828d259..3c4a2e00c9c 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.208 2000/11/08 22:09:58 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.209 2000/11/14 18:37:49 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -56,8 +56,8 @@
#include "miscadmin.h"
#include "mb/pg_wchar.h"
#else
-#define GetTemplateEncoding() 0 /* SQL_ASCII */
-#define GetTemplateEncodingName() "SQL_ASCII"
+#define GetStandardEncoding() 0 /* SQL_ASCII */
+#define GetStandardEncodingName() "SQL_ASCII"
#endif
extern List *parsetree; /* final parse result is delivered here */
@@ -146,8 +146,7 @@ static void doNegateFloat(Value *v);
%type <node> alter_column_action
%type <ival> drop_behavior
-%type <str> createdb_opt_location
-%type <ival> createdb_opt_encoding
+%type <list> createdb_opt_list, createdb_opt_item
%type <ival> opt_lock, lock_type
%type <boolean> opt_lmode, opt_force
@@ -347,7 +346,7 @@ static void doNegateFloat(Value *v);
OFFSET, OIDS, OPERATOR, OWNER, PASSWORD, PROCEDURAL,
REINDEX, RENAME, RESET, RETURNS, ROW, RULE,
SEQUENCE, SERIAL, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT, SYSID,
- TEMP, TOAST, TRUNCATE, TRUSTED,
+ TEMP, TEMPLATE, TOAST, TRUNCATE, TRUSTED,
UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
/* The grammar thinks these are keywords, but they are not in the keywords.c
@@ -687,7 +686,8 @@ CreateSchemaStmt: CREATE SCHEMA UserId
CreatedbStmt *n = makeNode(CreatedbStmt);
n->dbname = $3;
n->dbpath = NULL;
- n->encoding = GetTemplateEncoding();
+ n->dbtemplate = NULL;
+ n->encoding = -1;
$$ = (Node *)n;
}
;
@@ -2924,16 +2924,34 @@ LoadStmt: LOAD file_name
*
*****************************************************************************/
-CreatedbStmt: CREATE DATABASE database_name WITH createdb_opt_location createdb_opt_encoding
+CreatedbStmt: CREATE DATABASE database_name WITH createdb_opt_list
{
CreatedbStmt *n = makeNode(CreatedbStmt);
-
- if ($5 == NULL && $6 == -1)
- elog(ERROR, "CREATE DATABASE WITH requires at least one option");
+ List *l;
n->dbname = $3;
- n->dbpath = $5;
- n->encoding = ($6 == -1) ? GetTemplateEncoding() : $6;
+ /* set default options */
+ n->dbpath = NULL;
+ n->dbtemplate = NULL;
+ n->encoding = -1;
+ /* process additional options */
+ foreach(l, $5)
+ {
+ List *optitem = (List *) lfirst(l);
+
+ switch (lfirsti(optitem))
+ {
+ case 1:
+ n->dbpath = (char *) lsecond(optitem);
+ break;
+ case 2:
+ n->dbtemplate = (char *) lsecond(optitem);
+ break;
+ case 3:
+ n->encoding = lfirsti(lnext(optitem));
+ break;
+ }
+ }
$$ = (Node *)n;
}
| CREATE DATABASE database_name
@@ -2941,27 +2959,51 @@ CreatedbStmt: CREATE DATABASE database_name WITH createdb_opt_location createdb
CreatedbStmt *n = makeNode(CreatedbStmt);
n->dbname = $3;
n->dbpath = NULL;
- n->encoding = GetTemplateEncoding();
+ n->dbtemplate = NULL;
+ n->encoding = -1;
$$ = (Node *)n;
}
;
-createdb_opt_location: LOCATION '=' Sconst { $$ = $3; }
- | LOCATION '=' DEFAULT { $$ = NULL; }
- | /*EMPTY*/ { $$ = NULL; }
+createdb_opt_list: createdb_opt_item
+ { $$ = makeList1($1); }
+ | createdb_opt_list createdb_opt_item
+ { $$ = lappend($1, $2); }
;
-createdb_opt_encoding: ENCODING '=' Sconst
+/*
+ * createdb_opt_item returns 2-element lists, with the first element
+ * being an integer code to indicate which item was specified.
+ */
+createdb_opt_item: LOCATION '=' Sconst
{
+ $$ = lconsi(1, makeList1($3));
+ }
+ | LOCATION '=' DEFAULT
+ {
+ $$ = lconsi(1, makeList1((char *) NULL));
+ }
+ | TEMPLATE '=' name
+ {
+ $$ = lconsi(2, makeList1($3));
+ }
+ | TEMPLATE '=' DEFAULT
+ {
+ $$ = lconsi(2, makeList1((char *) NULL));
+ }
+ | ENCODING '=' Sconst
+ {
+ int encoding;
#ifdef MULTIBYTE
- $$ = pg_char_to_encoding($3);
- if ($$ == -1)
+ encoding = pg_char_to_encoding($3);
+ if (encoding == -1)
elog(ERROR, "%s is not a valid encoding name", $3);
#else
- if (strcasecmp($3, GetTemplateEncodingName()) != 0)
+ if (strcasecmp($3, GetStandardEncodingName()) != 0)
elog(ERROR, "Multi-byte support is not enabled");
- $$ = GetTemplateEncoding();
+ encoding = GetStandardEncoding();
#endif
+ $$ = lconsi(3, makeListi1(encoding));
}
| ENCODING '=' Iconst
{
@@ -2969,18 +3011,14 @@ createdb_opt_encoding: ENCODING '=' Sconst
if (!pg_get_encent_by_encoding($3))
elog(ERROR, "%d is not a valid encoding code", $3);
#else
- if ($3 != GetTemplateEncoding())
+ if ($3 != GetStandardEncoding())
elog(ERROR, "Multi-byte support is not enabled");
#endif
- $$ = $3;
+ $$ = lconsi(3, makeListi1($3));
}
| ENCODING '=' DEFAULT
{
- $$ = GetTemplateEncoding();
- }
- | /*EMPTY*/
- {
- $$ = -1;
+ $$ = lconsi(3, makeListi1(-1));
}
;
@@ -5495,6 +5533,7 @@ TokenId: ABSOLUTE { $$ = "absolute"; }
| STDOUT { $$ = "stdout"; }
| SYSID { $$ = "sysid"; }
| TEMP { $$ = "temp"; }
+ | TEMPLATE { $$ = "template"; }
| TEMPORARY { $$ = "temporary"; }
| TIMEZONE_HOUR { $$ = "timezone_hour"; }
| TIMEZONE_MINUTE { $$ = "timezone_minute"; }
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index f3e4d85e4c5..19ec40f15ba 100644
--- a/src/backend/parser/keywords.c
+++ b/src/backend/parser/keywords.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.84 2000/11/08 21:28:06 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.85 2000/11/14 18:37:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -247,6 +247,7 @@ static ScanKeyword ScanKeywords[] = {
{"sysid", SYSID},
{"table", TABLE},
{"temp", TEMP},
+ {"template", TEMPLATE},
{"temporary", TEMPORARY},
{"then", THEN},
{"time", TIME},