6
6
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
7
7
* Portions Copyright (c) 1994, Regents of the University of California
8
8
*
9
- *$Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.213 2002/01/03 23 :21:31 tgl Exp $
9
+ *$Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.214 2002/02/25 04 :21:55 momjian Exp $
10
10
*
11
11
*-------------------------------------------------------------------------
12
12
*/
@@ -64,17 +64,22 @@ typedef struct
64
64
}CreateStmtContext ;
65
65
66
66
67
- static Query * transformStmt (ParseState * pstate ,Node * stmt );
67
+ static Query * transformStmt (ParseState * pstate ,Node * stmt ,
68
+ List * * extras_before ,List * * extras_after );
68
69
static Query * transformDeleteStmt (ParseState * pstate ,DeleteStmt * stmt );
69
- static Query * transformInsertStmt (ParseState * pstate ,InsertStmt * stmt );
70
+ static Query * transformInsertStmt (ParseState * pstate ,InsertStmt * stmt ,
71
+ List * * extras_before ,List * * extras_after );
70
72
static Query * transformIndexStmt (ParseState * pstate ,IndexStmt * stmt );
71
- static Query * transformRuleStmt (ParseState * query ,RuleStmt * stmt );
73
+ static Query * transformRuleStmt (ParseState * query ,RuleStmt * stmt ,
74
+ List * * extras_before ,List * * extras_after );
72
75
static Query * transformSelectStmt (ParseState * pstate ,SelectStmt * stmt );
73
76
static Query * transformSetOperationStmt (ParseState * pstate ,SelectStmt * stmt );
74
77
static Node * transformSetOperationTree (ParseState * pstate ,SelectStmt * stmt );
75
78
static Query * transformUpdateStmt (ParseState * pstate ,UpdateStmt * stmt );
76
- static Query * transformCreateStmt (ParseState * pstate ,CreateStmt * stmt );
77
- static Query * transformAlterTableStmt (ParseState * pstate ,AlterTableStmt * stmt );
79
+ static Query * transformCreateStmt (ParseState * pstate ,CreateStmt * stmt ,
80
+ List * * extras_before ,List * * extras_after );
81
+ static Query * transformAlterTableStmt (ParseState * pstate ,AlterTableStmt * stmt ,
82
+ List * * extras_before ,List * * extras_after );
78
83
static void transformColumnDefinition (ParseState * pstate ,
79
84
CreateStmtContext * cxt ,
80
85
ColumnDef * column );
@@ -101,9 +106,6 @@ static OidtransformFkeyGetColType(CreateStmtContext *cxt, char *colname);
101
106
static void release_pstate_resources (ParseState * pstate );
102
107
static FromExpr * makeFromExpr (List * fromlist ,Node * quals );
103
108
104
- /* kluge to return extra info from transformCreateStmt() */
105
- static List * extras_before ;
106
- static List * extras_after ;
107
109
108
110
109
111
/*
@@ -121,27 +123,24 @@ parse_analyze(Node *parseTree, ParseState *parentParseState)
121
123
List * result = NIL ;
122
124
ParseState * pstate = make_parsestate (parentParseState );
123
125
Query * query ;
126
+ /* Lists to return extra commands from transformation */
127
+ List * extras_before = NIL ;
128
+ List * extras_after = NIL ;
124
129
125
- extras_before = extras_after = NIL ;
126
-
127
- query = transformStmt (pstate ,parseTree );
130
+ query = transformStmt (pstate ,parseTree ,& extras_before ,& extras_after );
128
131
release_pstate_resources (pstate );
129
132
130
133
while (extras_before != NIL )
131
134
{
132
- result = lappend (result ,
133
- transformStmt (pstate ,lfirst (extras_before )));
134
- release_pstate_resources (pstate );
135
+ result = nconc (result ,parse_analyze (lfirst (extras_before ),pstate ));
135
136
extras_before = lnext (extras_before );
136
137
}
137
138
138
139
result = lappend (result ,query );
139
140
140
141
while (extras_after != NIL )
141
142
{
142
- result = lappend (result ,
143
- transformStmt (pstate ,lfirst (extras_after )));
144
- release_pstate_resources (pstate );
143
+ result = nconc (result ,parse_analyze (lfirst (extras_after ),pstate ));
145
144
extras_after = lnext (extras_after );
146
145
}
147
146
@@ -164,7 +163,8 @@ release_pstate_resources(ParseState *pstate)
164
163
* transform a Parse tree into a Query tree.
165
164
*/
166
165
static Query *
167
- transformStmt (ParseState * pstate ,Node * parseTree )
166
+ transformStmt (ParseState * pstate ,Node * parseTree ,
167
+ List * * extras_before ,List * * extras_after )
168
168
{
169
169
Query * result = NULL ;
170
170
@@ -174,22 +174,25 @@ transformStmt(ParseState *pstate, Node *parseTree)
174
174
* Non-optimizable statements
175
175
*/
176
176
case T_CreateStmt :
177
- result = transformCreateStmt (pstate , (CreateStmt * )parseTree );
177
+ result = transformCreateStmt (pstate , (CreateStmt * )parseTree ,
178
+ extras_before ,extras_after );
178
179
break ;
179
180
180
181
case T_IndexStmt :
181
182
result = transformIndexStmt (pstate , (IndexStmt * )parseTree );
182
183
break ;
183
184
184
185
case T_RuleStmt :
185
- result = transformRuleStmt (pstate , (RuleStmt * )parseTree );
186
+ result = transformRuleStmt (pstate , (RuleStmt * )parseTree ,
187
+ extras_before ,extras_after );
186
188
break ;
187
189
188
190
case T_ViewStmt :
189
191
{
190
192
ViewStmt * n = (ViewStmt * )parseTree ;
191
193
192
- n -> query = transformStmt (pstate , (Node * )n -> query );
194
+ n -> query = transformStmt (pstate , (Node * )n -> query ,
195
+ extras_before ,extras_after );
193
196
194
197
/*
195
198
* If a list of column names was given, run through and
@@ -239,20 +242,23 @@ transformStmt(ParseState *pstate, Node *parseTree)
239
242
240
243
result = makeNode (Query );
241
244
result -> commandType = CMD_UTILITY ;
242
- n -> query = transformStmt (pstate , (Node * )n -> query );
245
+ n -> query = transformStmt (pstate , (Node * )n -> query ,
246
+ extras_before ,extras_after );
243
247
result -> utilityStmt = (Node * )parseTree ;
244
248
}
245
249
break ;
246
250
247
251
case T_AlterTableStmt :
248
- result = transformAlterTableStmt (pstate , (AlterTableStmt * )parseTree );
252
+ result = transformAlterTableStmt (pstate , (AlterTableStmt * )parseTree ,
253
+ extras_before ,extras_after );
249
254
break ;
250
255
251
256
/*
252
257
* Optimizable statements
253
258
*/
254
259
case T_InsertStmt :
255
- result = transformInsertStmt (pstate , (InsertStmt * )parseTree );
260
+ result = transformInsertStmt (pstate , (InsertStmt * )parseTree ,
261
+ extras_before ,extras_after );
256
262
break ;
257
263
258
264
case T_DeleteStmt :
@@ -337,7 +343,8 @@ transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt)
337
343
* transform an Insert Statement
338
344
*/
339
345
static Query *
340
- transformInsertStmt (ParseState * pstate ,InsertStmt * stmt )
346
+ transformInsertStmt (ParseState * pstate ,InsertStmt * stmt ,
347
+ List * * extras_before ,List * * extras_after )
341
348
{
342
349
Query * qry = makeNode (Query );
343
350
List * sub_rtable ;
@@ -402,7 +409,12 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
402
409
sub_pstate -> p_rtable = sub_rtable ;
403
410
sub_pstate -> p_namespace = sub_namespace ;
404
411
405
- selectQuery = transformStmt (sub_pstate ,stmt -> selectStmt );
412
+ /*
413
+ * Note: we are not expecting that extras_before and extras_after
414
+ * are going to be used by the transformation of the SELECT statement.
415
+ */
416
+ selectQuery = transformStmt (sub_pstate ,stmt -> selectStmt ,
417
+ extras_before ,extras_after );
406
418
407
419
release_pstate_resources (sub_pstate );
408
420
pfree (sub_pstate );
@@ -658,7 +670,8 @@ CreateIndexName(char *table_name, char *column_name,
658
670
* - thomas 1997-12-02
659
671
*/
660
672
static Query *
661
- transformCreateStmt (ParseState * pstate ,CreateStmt * stmt )
673
+ transformCreateStmt (ParseState * pstate ,CreateStmt * stmt ,
674
+ List * * extras_before ,List * * extras_after )
662
675
{
663
676
CreateStmtContext cxt ;
664
677
Query * q ;
@@ -728,8 +741,8 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
728
741
q -> utilityStmt = (Node * )stmt ;
729
742
stmt -> tableElts = cxt .columns ;
730
743
stmt -> constraints = cxt .ckconstraints ;
731
- extras_before = cxt .blist ;
732
- extras_after = cxt .alist ;
744
+ * extras_before = nconc ( * extras_before , cxt .blist ) ;
745
+ * extras_after = nconc ( cxt .alist , * extras_after ) ;
733
746
734
747
return q ;
735
748
}
@@ -1668,7 +1681,8 @@ transformIndexStmt(ParseState *pstate, IndexStmt *stmt)
1668
1681
* trees which is transformed into a list of query trees.
1669
1682
*/
1670
1683
static Query *
1671
- transformRuleStmt (ParseState * pstate ,RuleStmt * stmt )
1684
+ transformRuleStmt (ParseState * pstate ,RuleStmt * stmt ,
1685
+ List * * extras_before ,List * * extras_after )
1672
1686
{
1673
1687
Query * qry ;
1674
1688
RangeTblEntry * oldrte ;
@@ -1797,7 +1811,8 @@ transformRuleStmt(ParseState *pstate, RuleStmt *stmt)
1797
1811
addRTEtoQuery (sub_pstate ,newrte , false, true);
1798
1812
1799
1813
/* Transform the rule action statement */
1800
- top_subqry = transformStmt (sub_pstate ,action );
1814
+ top_subqry = transformStmt (sub_pstate ,action ,
1815
+ extras_before ,extras_after );
1801
1816
1802
1817
/*
1803
1818
* We cannot support utility-statement actions (eg NOTIFY)
@@ -2494,7 +2509,8 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
2494
2509
*transform an Alter Table Statement
2495
2510
*/
2496
2511
static Query *
2497
- transformAlterTableStmt (ParseState * pstate ,AlterTableStmt * stmt )
2512
+ transformAlterTableStmt (ParseState * pstate ,AlterTableStmt * stmt ,
2513
+ List * * extras_before ,List * * extras_after )
2498
2514
{
2499
2515
CreateStmtContext cxt ;
2500
2516
Query * qry ;
@@ -2534,8 +2550,8 @@ transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt)
2534
2550
transformFKConstraints (pstate ,& cxt );
2535
2551
2536
2552
((ColumnDef * )stmt -> def )-> constraints = cxt .ckconstraints ;
2537
- extras_before = cxt .blist ;
2538
- extras_after = cxt .alist ;
2553
+ * extras_before = nconc ( * extras_before , cxt .blist ) ;
2554
+ * extras_after = nconc ( cxt .alist , * extras_after ) ;
2539
2555
break ;
2540
2556
2541
2557
case 'C' :
@@ -2571,8 +2587,8 @@ transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt)
2571
2587
2572
2588
Assert (cxt .columns == NIL );
2573
2589
stmt -> def = (Node * )nconc (cxt .ckconstraints ,cxt .fkconstraints );
2574
- extras_before = cxt .blist ;
2575
- extras_after = cxt .alist ;
2590
+ * extras_before = nconc ( * extras_before , cxt .blist ) ;
2591
+ * extras_after = nconc ( cxt .alist , * extras_after ) ;
2576
2592
break ;
2577
2593
2578
2594
default :