Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4527172

Browse files
committed
CHECK/DEFAULT syntax
1 parentbb951c6 commit4527172

File tree

3 files changed

+163
-25
lines changed

3 files changed

+163
-25
lines changed

‎src/backend/parser/gram.y

Lines changed: 156 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* 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 $
1414
*
1515
* HISTORY
1616
* AUTHORDATEMAJOR EVENT
@@ -49,6 +49,11 @@ static bool QueryIsRule = FALSE;
4949
static Node *saved_In_Expr;
5050
extern List *parsetree;
5151

52+
extern int CurScanPosition(void);
53+
extern int DefaultStartPosition;
54+
extern int CheckStartPosition;
55+
extern char *parseString;
56+
5257
/*
5358
* If you need access to certain yacc-generated variables and find that
5459
* 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);
113118
%type <str>relation_name, copy_file_name, copy_delimiter, def_name,
114119
database_name, access_method_clause, access_method, attr_name,
115120
class, index_name, name, file_name, recipe_name,
116-
var_name, aggr_argtype
121+
var_name, aggr_argtype, OptDefault, CheckElem
117122

118123
%type <str>opt_id, opt_portal_name,
119124
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);
124129
%type <chr>operation
125130

126131
%type <list>stmtblock, stmtmulti,
127-
relation_name_list, OptTableElementList,
128-
tableElementList, OptInherit, definition,
132+
relation_name_list, OptTableElementList, tableElementList,
133+
OptInherit, OptCheck, CheckList, definition,
129134
opt_with, def_args, def_name_list, func_argtypes,
130135
oper_argtypes, OptStmtList, OptStmtBlock, OptStmtMulti,
131136
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,
135140
def_list, opt_indirection, group_clause, groupby_list
136141

137142
%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);
154159
%type <defelt>def_elem
155160
%type <node>def_arg, columnElem, where_clause,
156161
a_expr, a_expr_or_null, AexprConst,
162+
default_expr, default_expr_or_null,
157163
in_expr_nodes, not_in_expr_nodes,
158-
having_clause
164+
having_clause, default_expr
159165
%type <value>NumConst
160166
%type <attr>event_object, attr
161167
%type <sortgroupby>groupby
@@ -182,9 +188,9 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
182188
%tokenABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYZE,
183189
AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC,
184190
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,
188194
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
189195
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
190196
ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW,
@@ -333,20 +339,123 @@ AddAttrStmt: ALTER TABLE relation_name opt_inh_star ADD COLUMN columnDef
333339
}
334340
;
335341

336-
columnDef: Id Typename opt_null
342+
columnDef: Id TypenameOptDefaultopt_null
337343
{
338344
$$ = makeNode(ColumnDef);
339345
$$->colname = $1;
340346
$$->typename = $2;
341-
$$->is_not_null = $3;
347+
$$->defval = $3;
348+
$$->is_not_null = $4;
342349
}
343350
;
344351

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+
350459

351460
/*****************************************************************************
352461
*
@@ -425,15 +534,17 @@ copy_delimiter: USING DELIMITERS Sconst { $$ = $3;}
425534
*****************************************************************************/
426535

427536
CreateStmt: CREATE TABLE relation_name '(' OptTableElementList ')'
428-
OptInherit OptArchiveType OptLocation OptArchiveLocation
537+
OptInherit OptCheck OptArchiveType OptLocation
538+
OptArchiveLocation
429539
{
430540
CreateStmt *n = makeNode(CreateStmt);
431541
n->relname = $3;
432542
n->tableElts = $5;
433543
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;
437548
$$ = (Node *)n;
438549
}
439550
;
@@ -475,6 +586,29 @@ OptInherit: INHERITS '(' relation_name_list ')'{ $$ = $3; }
475586
| /*EMPTY*/{ $$ = NIL; }
476587
;
477588

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+
;
478612

479613
/*****************************************************************************
480614
*

‎src/backend/parser/keywords.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.10 1997/04/23 06:04:46 vadim Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.11 1997/08/20 01:12:04 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -54,6 +54,7 @@ static ScanKeyword ScanKeywords[] = {
5454
{"by",BY},
5555
{"cast",CAST},
5656
{"change",CHANGE},
57+
{"check",CHECK},
5758
{"close",CLOSE},
5859
{"cluster",CLUSTER},
5960
{"column",COLUMN},
@@ -64,6 +65,7 @@ static ScanKeyword ScanKeywords[] = {
6465
{"cursor",CURSOR},
6566
{"database",DATABASE},
6667
{"declare",DECLARE},
68+
{"default",DEFAULT},
6769
{"delete",DELETE},
6870
{"delimiters",DELIMITERS },
6971
{"desc",DESC},

‎src/include/nodes/parsenodes.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: parsenodes.h,v 1.17 1997/08/19 04:46:15 vadim Exp $
9+
* $Id: parsenodes.h,v 1.18 1997/08/20 01:12:38 vadim Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -136,6 +136,7 @@ typedef struct CreateStmt {
136136
ArchTypearchiveType;/* archive mode (ARCH_NONE if none */
137137
intlocation;/* smgrid (-1 if none) */
138138
intarchiveLoc;/* smgrid (-1 if none) */
139+
List*check;/* list of CHECK constr */
139140
}CreateStmt;
140141

141142
/* ----------------------
@@ -607,7 +608,8 @@ typedef struct ColumnDef {
607608
NodeTagtype;
608609
char*colname;/* name of column */
609610
TypeName*typename;/* type of column */
610-
boolis_not_null;/* flag to NOT NULL constraint */
611+
boolis_not_null;/* flag to NOT NULL constraint */
612+
char*defval;/* default value of column */
611613
}ColumnDef;
612614

613615
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp