aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y134
-rw-r--r--src/backend/parser/keywords.c3
2 files changed, 99 insertions, 38 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 1c499f417d9..b7b2f6a693d 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.331 2002/06/19 15:40:58 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.332 2002/06/20 16:00:43 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -159,8 +159,8 @@ static void doNegateFloat(Value *v);
%type <node> alter_column_default
%type <ival> add_drop, drop_behavior, opt_drop_behavior
-%type <list> createdb_opt_list
-%type <defelt> createdb_opt_item
+%type <list> createdb_opt_list, copy_opt_list
+%type <defelt> createdb_opt_item, copy_opt_item
%type <ival> opt_lock, lock_type
%type <boolean> opt_force, opt_or_replace
@@ -182,7 +182,7 @@ static void doNegateFloat(Value *v);
%type <str> TriggerEvents
%type <value> TriggerFuncArg
-%type <str> relation_name, copy_file_name, copy_delimiter, copy_null,
+%type <str> relation_name, copy_file_name,
database_name, access_method_clause, access_method, attr_name,
index_name, name, function_name, file_name
@@ -236,11 +236,14 @@ static void doNegateFloat(Value *v);
%type <ival> opt_interval
%type <node> overlay_placing, substr_from, substr_for
-%type <boolean> opt_binary, opt_instead, opt_cursor
-%type <boolean> opt_with_copy, index_opt_unique, opt_verbose, opt_full
+%type <boolean> opt_instead, opt_cursor
+%type <boolean> index_opt_unique, opt_verbose, opt_full
%type <boolean> opt_freeze
+%type <defelt> opt_binary, opt_oids, copy_delimiter
-%type <ival> copy_dirn, direction, reindex_type, drop_type,
+%type <boolean> copy_from
+
+%type <ival> direction, reindex_type, drop_type,
opt_column, event, comment_type
%type <ival> fetch_how_many
@@ -330,8 +333,8 @@ static void doNegateFloat(Value *v);
CURRENT_TIMESTAMP, CURRENT_USER, CURSOR, CYCLE,
DATABASE, DAY_P, DEC, DECIMAL, DECLARE, DEFAULT,
- DEFERRABLE, DEFERRED, DEFINER, DELETE_P, DELIMITERS, DESC,
- DISTINCT, DO, DOMAIN_P, DOUBLE, DROP,
+ DEFERRABLE, DEFERRED, DEFINER, DELETE_P, DELIMITER, DELIMITERS,
+ DESC, DISTINCT, DO, DOMAIN_P, DOUBLE, DROP,
EACH, ELSE, ENCODING, ENCRYPTED, END_TRANS, ESCAPE, EXCEPT,
EXCLUSIVE, EXECUTE, EXISTS, EXPLAIN, EXTERNAL, EXTRACT,
@@ -1293,27 +1296,38 @@ opt_id: ColId { $$ = $1; }
/*****************************************************************************
*
* QUERY :
- * COPY [BINARY] <relname> FROM/TO
- * [USING DELIMITERS <delimiter>]
+ * COPY <relname> FROM/TO [WITH options]
+ *
+ * BINARY, OIDS, and DELIMITERS kept in old locations
+ * for backward compatibility. 2002-06-18
*
*****************************************************************************/
-CopyStmt: COPY opt_binary qualified_name opt_with_copy copy_dirn copy_file_name copy_delimiter copy_null
+CopyStmt: COPY opt_binary qualified_name opt_oids copy_from
+ copy_file_name copy_delimiter opt_with copy_opt_list
{
CopyStmt *n = makeNode(CopyStmt);
- n->binary = $2;
n->relation = $3;
- n->oids = $4;
- n->direction = $5;
+ n->is_from = $5;
n->filename = $6;
- n->delimiter = $7;
- n->null_print = $8;
+
+ n->options = NIL;
+ /* Concatenate user-supplied flags */
+ if ($2)
+ n->options = lappend(n->options, $2);
+ if ($4)
+ n->options = lappend(n->options, $4);
+ if ($7)
+ n->options = lappend(n->options, $7);
+ if ($9)
+ n->options = nconc(n->options, $9);
$$ = (Node *)n;
}
;
-copy_dirn: TO { $$ = TO; }
- | FROM { $$ = FROM; }
+copy_from:
+ FROM { $$ = TRUE; }
+ | TO { $$ = FALSE; }
;
/*
@@ -1327,30 +1341,79 @@ copy_file_name:
| STDOUT { $$ = NULL; }
;
-opt_binary: BINARY { $$ = TRUE; }
- | /*EMPTY*/ { $$ = FALSE; }
+
+
+copy_opt_list:
+ copy_opt_list copy_opt_item { $$ = lappend($1, $2); }
+ | /* EMPTY */ { $$ = NIL; }
;
-opt_with_copy:
- WITH OIDS { $$ = TRUE; }
- | /*EMPTY*/ { $$ = FALSE; }
+
+copy_opt_item:
+ BINARY
+ {
+ $$ = makeNode(DefElem);
+ $$->defname = "binary";
+ $$->arg = (Node *)makeInteger(TRUE);
+ }
+ | OIDS
+ {
+ $$ = makeNode(DefElem);
+ $$->defname = "oids";
+ $$->arg = (Node *)makeInteger(TRUE);
+ }
+ | DELIMITER opt_as Sconst
+ {
+ $$ = makeNode(DefElem);
+ $$->defname = "delimiter";
+ $$->arg = (Node *)makeString($3);
+ }
+ | NULL_P opt_as Sconst
+ {
+ $$ = makeNode(DefElem);
+ $$->defname = "null";
+ $$->arg = (Node *)makeString($3);
+ }
+ ;
+
+/* The following exist for backward compatibility */
+
+opt_binary:
+ BINARY
+ {
+ $$ = makeNode(DefElem);
+ $$->defname = "binary";
+ $$->arg = (Node *)makeInteger(TRUE);
+ }
+ | /*EMPTY*/ { $$ = NULL; }
+ ;
+
+opt_oids:
+ WITH OIDS
+ {
+ $$ = makeNode(DefElem);
+ $$->defname = "oids";
+ $$->arg = (Node *)makeInteger(TRUE);
+ }
+ | /*EMPTY*/ { $$ = NULL; }
;
-/*
- * the default copy delimiter is tab but the user can configure it
- */
copy_delimiter:
- opt_using DELIMITERS Sconst { $$ = $3; }
- | /*EMPTY*/ { $$ = "\t"; }
+ /* USING DELIMITERS kept for backward compatibility. 2002-06-15 */
+ opt_using DELIMITERS Sconst
+ {
+ $$ = makeNode(DefElem);
+ $$->defname = "delimiter";
+ $$->arg = (Node *)makeString($3);
+ }
+ | /*EMPTY*/ { $$ = NULL; }
;
-opt_using: USING {}
+opt_using:
+ USING {}
| /*EMPTY*/ {}
;
-copy_null: WITH NULL_P AS Sconst { $$ = $4; }
- | /*EMPTY*/ { $$ = "\\N"; }
- ;
/*****************************************************************************
*
@@ -3422,10 +3485,6 @@ createdb_opt_list:
| /* EMPTY */ { $$ = NIL; }
;
-/*
- * 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 opt_equal Sconst
{
@@ -6529,6 +6588,7 @@ unreserved_keyword:
| DEFERRED
| DEFINER
| DELETE_P
+ | DELIMITER
| DELIMITERS
| DOMAIN_P
| DOUBLE
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index 0f441290ea8..c125cc79fbb 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.114 2002/06/15 03:00:03 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.115 2002/06/20 16:00:43 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -98,6 +98,7 @@ static const ScanKeyword ScanKeywords[] = {
{"deferred", DEFERRED},
{"definer", DEFINER},
{"delete", DELETE_P},
+ {"delimiter", DELIMITER},
{"delimiters", DELIMITERS},
{"desc", DESC},
{"distinct", DISTINCT},