10
10
*
11
11
*
12
12
* IDENTIFICATION
13
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.36 1997/08/19 04:44:01 vadim Exp $
13
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.37 1997/08/20 01:12:02 vadim Exp $
14
14
*
15
15
* HISTORY
16
16
* AUTHOR DATE MAJOR EVENT
@@ -49,6 +49,11 @@ static bool QueryIsRule = FALSE;
49
49
static Node *saved_In_Expr;
50
50
extern List *parsetree;
51
51
52
+ extern int CurScanPosition(void);
53
+ extern int DefaultStartPosition;
54
+ extern int CheckStartPosition;
55
+ extern char *parseString;
56
+
52
57
/*
53
58
* If you need access to certain yacc-generated variables and find that
54
59
* they're static by default, uncomment the next line. (this is not a
@@ -113,7 +118,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
113
118
%type <str> relation_name, copy_file_name, copy_delimiter, def_name,
114
119
database_name, access_method_clause, access_method, attr_name,
115
120
class, index_name, name, file_name, recipe_name,
116
- var_name, aggr_argtype
121
+ var_name, aggr_argtype, OptDefault, CheckElem
117
122
118
123
%type <str> opt_id, opt_portal_name,
119
124
before_clause, after_clause, all_Op, MathOp, opt_name, opt_unique,
@@ -124,14 +129,14 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
124
129
%type <chr> operation
125
130
126
131
%type <list> stmtblock, stmtmulti,
127
- relation_name_list, OptTableElementList,
128
- tableElementList, OptInherit , definition,
132
+ relation_name_list, OptTableElementList, tableElementList,
133
+ OptInherit, OptCheck, CheckList , definition,
129
134
opt_with, def_args, def_name_list, func_argtypes,
130
135
oper_argtypes, OptStmtList, OptStmtBlock, OptStmtMulti,
131
136
opt_column_list, columnList, opt_va_list, va_list,
132
- sort_clause, sortby_list, index_params, index_list,
133
- name_list, from_clause, from_list, opt_array_bounds, nest_array_bounds,
134
- expr_list, attrs, res_target_list, res_target_list2,
137
+ sort_clause, sortby_list, index_params, index_list, name_list,
138
+ from_clause, from_list, opt_array_bounds, nest_array_bounds,
139
+ expr_list, default_expr_list, attrs, res_target_list, res_target_list2,
135
140
def_list, opt_indirection, group_clause, groupby_list
136
141
137
142
%type <boolean> opt_inh_star, opt_binary, opt_instead, opt_with_copy,
@@ -154,8 +159,9 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
154
159
%type <defelt> def_elem
155
160
%type <node> def_arg, columnElem, where_clause,
156
161
a_expr, a_expr_or_null, AexprConst,
162
+ default_expr, default_expr_or_null,
157
163
in_expr_nodes, not_in_expr_nodes,
158
- having_clause
164
+ having_clause, default_expr
159
165
%type <value> NumConst
160
166
%type <attr> event_object, attr
161
167
%type <sortgroupby> groupby
@@ -182,9 +188,9 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
182
188
%token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYZE,
183
189
AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC,
184
190
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BY,
185
- CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
186
- CURRENT, CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC ,
187
- DISTINCT, DO, DROP, END_TRANS,
191
+ CAST, CHANGE, CHECK, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
192
+ CURRENT, CURSOR, DATABASE, DECLARE, DEFAULT, DELETE ,
193
+ DELIMITERS, DESC, DISTINCT, DO, DROP, END_TRANS,
188
194
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
189
195
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
190
196
ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW,
@@ -333,20 +339,123 @@ AddAttrStmt: ALTER TABLE relation_name opt_inh_star ADD COLUMN columnDef
333
339
}
334
340
;
335
341
336
- columnDef: Id Typename opt_null
342
+ columnDef: Id Typename OptDefault opt_null
337
343
{
338
344
$$ = makeNode(ColumnDef);
339
345
$$->colname = $1;
340
346
$$->typename = $2;
341
- $$->is_not_null = $3;
347
+ $$->defval = $3;
348
+ $$->is_not_null = $4;
342
349
}
343
350
;
344
351
345
- opt_null: PNULL { $$ = false; }
346
- | NOT PNULL { $$ = true; }
347
- | NOTNULL { $$ = true; }
348
- | /* EMPTY */ { $$ = false; }
349
- ;
352
+ OptDefault: DEFAULT default_expr {
353
+ int deflen = CurScanPosition() - DefaultStartPosition;
354
+ char *defval;
355
+
356
+ defval = (char*) palloc (deflen + 1);
357
+ memcpy (defval,
358
+ parseString + DefaultStartPosition,
359
+ deflen);
360
+ defval[deflen] = 0;
361
+ $$ = defval;
362
+ }
363
+ | /*EMPTY*/ { $$ = NULL; }
364
+ ;
365
+
366
+ default_expr_or_null: default_expr
367
+ { $$ = $1;}
368
+ | Pnull
369
+ {
370
+ A_Const *n = makeNode(A_Const);
371
+ n->val.type = T_Null;
372
+ $$ = (Node *)n;
373
+ }
374
+
375
+ default_expr: AexprConst
376
+ {
377
+ if (nodeTag($1) != T_A_Const)
378
+ elog (WARN, "Cannot handle parameter in DEFAULT");
379
+ $$ = $1;
380
+ }
381
+ | '-' default_expr %prec UMINUS
382
+ { $$ = makeA_Expr(OP, "-", NULL, $2); }
383
+ | default_expr '+' default_expr
384
+ { $$ = makeA_Expr(OP, "+", $1, $3); }
385
+ | default_expr '-' default_expr
386
+ { $$ = makeA_Expr(OP, "-", $1, $3); }
387
+ | default_expr '/' default_expr
388
+ { $$ = makeA_Expr(OP, "/", $1, $3); }
389
+ | default_expr '*' default_expr
390
+ { $$ = makeA_Expr(OP, "*", $1, $3); }
391
+ | default_expr '<' default_expr
392
+ { $$ = makeA_Expr(OP, "<", $1, $3); }
393
+ | default_expr '>' default_expr
394
+ { $$ = makeA_Expr(OP, ">", $1, $3); }
395
+ | default_expr '=' default_expr
396
+ { $$ = makeA_Expr(OP, "=", $1, $3); }
397
+ | ':' default_expr
398
+ { $$ = makeA_Expr(OP, ":", NULL, $2); }
399
+ | ';' default_expr
400
+ { $$ = makeA_Expr(OP, ";", NULL, $2); }
401
+ | '|' default_expr
402
+ { $$ = makeA_Expr(OP, "|", NULL, $2); }
403
+ | AexprConst TYPECAST Typename
404
+ {
405
+ /* AexprConst can be either A_Const or ParamNo */
406
+ if (nodeTag($1) == T_A_Const) {
407
+ ((A_Const *)$1)->typename = $3;
408
+ }else {
409
+ elog (WARN, "Cannot handle parameter in DEFAULT");
410
+ }
411
+ $$ = (Node *)$1;
412
+ }
413
+ | CAST AexprConst AS Typename
414
+ {
415
+ /* AexprConst can be either A_Const or ParamNo */
416
+ if (nodeTag($2) == T_A_Const) {
417
+ ((A_Const *)$2)->typename = $4;
418
+ }else {
419
+ elog (WARN, "Cannot handle parameter in DEFAULT");
420
+ }
421
+ $$ = (Node *)$2;
422
+ }
423
+ | '(' default_expr ')'
424
+ { $$ = $2; }
425
+ | default_expr Op default_expr
426
+ { $$ = makeA_Expr(OP, $2, $1, $3); }
427
+ | Op default_expr
428
+ { $$ = makeA_Expr(OP, $1, NULL, $2); }
429
+ | default_expr Op
430
+ { $$ = makeA_Expr(OP, $2, $1, NULL); }
431
+ | name '(' ')'
432
+ {
433
+ FuncCall *n = makeNode(FuncCall);
434
+ n->funcname = $1;
435
+ n->args = NIL;
436
+ $$ = (Node *)n;
437
+ }
438
+ | name '(' default_expr_list ')'
439
+ {
440
+ FuncCall *n = makeNode(FuncCall);
441
+ n->funcname = $1;
442
+ n->args = $3;
443
+ $$ = (Node *)n;
444
+ }
445
+ ;
446
+
447
+ default_expr_list: default_expr_or_null
448
+ { $$ = lcons($1, NIL); }
449
+ | default_expr_list ',' default_expr_or_null
450
+ { $$ = lappend($1, $3); }
451
+ ;
452
+
453
+ opt_null: PNULL { $$ = false; }
454
+ | NOT PNULL { $$ = true; }
455
+ | NOTNULL { $$ = true; }
456
+ | /* EMPTY */ { $$ = false; }
457
+ ;
458
+
350
459
351
460
/*****************************************************************************
352
461
*
@@ -425,15 +534,17 @@ copy_delimiter: USING DELIMITERS Sconst { $$ = $3;}
425
534
*****************************************************************************/
426
535
427
536
CreateStmt: CREATE TABLE relation_name '(' OptTableElementList ')'
428
- OptInherit OptArchiveType OptLocation OptArchiveLocation
537
+ OptInherit OptCheck OptArchiveType OptLocation
538
+ OptArchiveLocation
429
539
{
430
540
CreateStmt *n = makeNode(CreateStmt);
431
541
n->relname = $3;
432
542
n->tableElts = $5;
433
543
n->inhRelnames = $7;
434
- n->archiveType = $8;
435
- n->location = $9;
436
- n->archiveLoc = $10;
544
+ n->check = $8;
545
+ n->archiveType = $9;
546
+ n->location = $10;
547
+ n->archiveLoc = $11;
437
548
$$ = (Node *)n;
438
549
}
439
550
;
@@ -475,6 +586,29 @@ OptInherit: INHERITS '(' relation_name_list ')' { $$ = $3; }
475
586
| /*EMPTY*/ { $$ = NIL; }
476
587
;
477
588
589
+ OptCheck: CheckList { $$ = $1; }
590
+ | { $$ = NULL; }
591
+ ;
592
+
593
+ CheckList :
594
+ CheckList ',' CheckElem
595
+ { $$ = lappend($1, $3); }
596
+ | CheckElem
597
+ { $$ = lcons($1, NIL); }
598
+ ;
599
+
600
+ CheckElem: CHECK a_expr {
601
+ int chklen = CurScanPosition() - CheckStartPosition;
602
+ char *check;
603
+
604
+ check = (char*) palloc (chklen + 1);
605
+ memcpy (check,
606
+ parseString + CheckStartPosition,
607
+ chklen);
608
+ check[chklen] = 0;
609
+ $$ = check;
610
+ }
611
+ ;
478
612
479
613
/*****************************************************************************
480
614
*
0 commit comments