Age Owner Branch data TLA Line data Source code
1 : : %{
2 : : /*-------------------------------------------------------------------------
3 : : *
4 : : * bootparse.y
5 : : * yacc grammar for the "bootstrap" mode (BKI file format)
6 : : *
7 : : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
8 : : * Portions Copyright (c) 1994, Regents of the University of California
9 : : *
10 : : *
11 : : * IDENTIFICATION
12 : : * src/backend/bootstrap/bootparse.y
13 : : *
14 : : *-------------------------------------------------------------------------
15 : : */
16 : :
17 : : #include "postgres.h"
18 : :
19 : : #include <unistd.h>
20 : :
21 : : #include "bootstrap/bootstrap.h"
22 : : #include "catalog/heap.h"
23 : : #include "catalog/namespace.h"
24 : : #include "catalog/pg_am.h"
25 : : #include "catalog/pg_authid.h"
26 : : #include "catalog/pg_class.h"
27 : : #include "catalog/pg_namespace.h"
28 : : #include "catalog/pg_tablespace.h"
29 : : #include "catalog/toasting.h"
30 : : #include "commands/defrem.h"
31 : : #include "miscadmin.h"
32 : : #include "nodes/makefuncs.h"
33 : : #include "utils/memutils.h"
34 : :
35 : :
36 : : /*
37 : : * Bison doesn't allocate anything that needs to live across parser calls,
38 : : * so we can easily have it use palloc instead of malloc. This prevents
39 : : * memory leaks if we error out during parsing.
40 : : */
41 : : #define YYMALLOC palloc
42 : : #define YYFREE pfree
43 : :
44 : : static MemoryContext per_line_ctx = NULL;
45 : :
46 : : static void
7126 neilc@samurai.com 47 :CBC 429624 : do_start(void)
48 : : {
2557 tgl@sss.pgh.pa.us 49 [ - + ]: 429624 : Assert(CurrentMemoryContext == CurTransactionContext);
50 : : /* First time through, create the per-line working context */
51 [ + + ]: 429624 : if (per_line_ctx == NULL)
52 : 39 : per_line_ctx = AllocSetContextCreate(CurTransactionContext,
53 : : "bootstrap per-line processing",
54 : : ALLOCSET_DEFAULT_SIZES);
55 : 429624 : MemoryContextSwitchTo(per_line_ctx);
8373 peter_e@gmx.net 56 : 429624 : }
57 : :
58 : :
59 : : static void
7126 neilc@samurai.com 60 : 429624 : do_end(void)
61 : : {
62 : : /* Reclaim memory allocated while processing this line */
2557 tgl@sss.pgh.pa.us 63 : 429624 : MemoryContextSwitchTo(CurTransactionContext);
64 : 429624 : MemoryContextReset(per_line_ctx);
7457 65 [ - + ]: 429624 : CHECK_FOR_INTERRUPTS(); /* allow SIGINT to kill bootstrap run */
8373 peter_e@gmx.net 66 [ - + ]: 429624 : if (isatty(0))
67 : : {
8373 peter_e@gmx.net 68 :UBC 0 : printf("bootstrap> ");
69 : 0 : fflush(stdout);
70 : : }
8373 peter_e@gmx.net 71 :CBC 429624 : }
72 : :
73 : :
74 : : static int num_columns_read = 0;
75 : :
76 : : %}
77 : :
78 : : %expect 0
79 : : %name-prefix="boot_yy"
80 : :
81 : : %union
82 : : {
83 : : List *list;
84 : : IndexElem *ielem;
85 : : char *str;
86 : : const char *kw;
87 : : int ival;
88 : : Oid oidval;
89 : : }
90 : :
91 : : %type <list> boot_index_params
92 : : %type <ielem> boot_index_param
93 : : %type <str> boot_ident
94 : : %type <ival> optbootstrap optsharedrelation boot_column_nullness
95 : : %type <oidval> oidspec optrowtypeoid
96 : :
97 : : %token <str> ID
98 : : %token COMMA EQUALS LPAREN RPAREN
99 : : /* NULLVAL is a reserved keyword */
100 : : %token NULLVAL
101 : : /* All the rest are unreserved, and should be handled in boot_ident! */
102 : : %token <kw> OPEN XCLOSE XCREATE INSERT_TUPLE
103 : : %token <kw> XDECLARE INDEX ON USING XBUILD INDICES UNIQUE XTOAST
104 : : %token <kw> OBJ_ID XBOOTSTRAP XSHARED_RELATION XROWTYPE_OID
105 : : %token <kw> XFORCE XNOT XNULL
106 : :
107 : : %start TopLevel
108 : :
109 : : %%
110 : :
111 : : TopLevel:
112 : : Boot_Queries
113 : : |
114 : : ;
115 : :
116 : : Boot_Queries:
117 : : Boot_Query
118 : : | Boot_Queries Boot_Query
119 : : ;
120 : :
121 : : Boot_Query :
122 : : Boot_OpenStmt
123 : : | Boot_CloseStmt
124 : : | Boot_CreateStmt
125 : : | Boot_InsertStmt
126 : : | Boot_DeclareIndexStmt
127 : : | Boot_DeclareUniqueIndexStmt
128 : : | Boot_DeclareToastStmt
129 : : | Boot_BuildIndsStmt
130 : : ;
131 : :
132 : : Boot_OpenStmt:
133 : : OPEN boot_ident
134 : : {
135 : 2340 : do_start();
5313 tgl@sss.pgh.pa.us 136 : 2340 : boot_openrel($2);
8373 peter_e@gmx.net 137 : 2340 : do_end();
138 : : }
139 : : ;
140 : :
141 : : Boot_CloseStmt:
142 : : XCLOSE boot_ident
143 : : {
144 : 2496 : do_start();
5313 tgl@sss.pgh.pa.us 145 : 2496 : closerel($2);
8373 peter_e@gmx.net 146 : 2496 : do_end();
147 : : }
148 : : ;
149 : :
150 : : Boot_CreateStmt:
151 : : XCREATE boot_ident oidspec optbootstrap optsharedrelation optrowtypeoid LPAREN
152 : : {
153 : 2496 : do_start();
154 : 2496 : numattr = 0;
6940 tgl@sss.pgh.pa.us 155 [ - + - - : 2496 : elog(DEBUG4, "creating%s%s relation %s %u",
- - ]
156 : : $4 ? " bootstrap" : "",
157 : : $5 ? " shared" : "",
158 : : $2,
159 : : $3);
160 : : }
161 : : boot_column_list
162 : : {
8373 peter_e@gmx.net 163 : 2496 : do_end();
164 : : }
165 : : RPAREN
166 : : {
167 : : TupleDesc tupdesc;
168 : : bool shared_relation;
169 : : bool mapped_relation;
170 : :
171 : 2496 : do_start();
172 : :
1972 andres@anarazel.de 173 : 2496 : tupdesc = CreateTupleDesc(numattr, attrtypes);
174 : :
5180 tgl@sss.pgh.pa.us 175 : 2496 : shared_relation = $5;
176 : :
177 : : /*
178 : : * The catalogs that use the relation mapper are the
179 : : * bootstrap catalogs plus the shared catalogs. If this
180 : : * ever gets more complicated, we should invent a BKI
181 : : * keyword to mark the mapped catalogs, but for now a
182 : : * quick hack seems the most appropriate thing. Note in
183 : : * particular that all "nailed" heap rels (see formrdesc
184 : : * in relcache.c) must be mapped.
185 : : */
186 [ + + + + ]: 2496 : mapped_relation = ($4 || shared_relation);
187 : :
5314 188 [ + + ]: 2496 : if ($4)
189 : : {
190 : : TransactionId relfrozenxid;
191 : : MultiXactId relminmxid;
192 : :
8023 193 [ - + ]: 156 : if (boot_reldesc)
194 : : {
7628 bruce@momjian.us 195 [ # # ]:UBC 0 : elog(DEBUG4, "create bootstrap: warning, open relation exists, closing first");
9715 196 : 0 : closerel(NULL);
197 : : }
198 : :
5313 tgl@sss.pgh.pa.us 199 : 0 : boot_reldesc = heap_create($2,
200 : : PG_CATALOG_NAMESPACE,
201 : : shared_relation ? GLOBALTABLESPACE_OID : 0,
5314 tgl@sss.pgh.pa.us 202 [ - + ]:CBC 156 : $3,
203 : : InvalidOid,
204 : : HEAP_TABLE_AM_OID,
205 : : tupdesc,
206 : : RELKIND_RELATION,
207 : : RELPERSISTENCE_PERMANENT,
208 : : shared_relation,
209 : : mapped_relation,
210 : : true,
211 : : &relfrozenxid,
212 : : &relminmxid,
213 : : true);
7628 bruce@momjian.us 214 [ - + ]: 156 : elog(DEBUG4, "bootstrap relation created");
215 : : }
216 : : else
217 : : {
218 : : Oid id;
219 : :
5313 tgl@sss.pgh.pa.us 220 : 2340 : id = heap_create_with_catalog($2,
221 : : PG_CATALOG_NAMESPACE,
222 : : shared_relation ? GLOBALTABLESPACE_OID : 0,
5314 223 : 2340 : $3,
1972 andres@anarazel.de 224 [ + + ]: 2340 : $6,
225 : : InvalidOid,
226 : : BOOTSTRAP_SUPERUSERID,
227 : : HEAP_TABLE_AM_OID,
228 : : tupdesc,
229 : : NIL,
230 : : RELKIND_RELATION,
231 : : RELPERSISTENCE_PERMANENT,
232 : : shared_relation,
233 : : mapped_relation,
234 : : ONCOMMIT_NOOP,
235 : : (Datum) 0,
236 : : false,
237 : : true,
238 : : false,
239 : : InvalidOid,
240 : : NULL);
4683 peter_e@gmx.net 241 [ - + ]: 2340 : elog(DEBUG4, "relation created with OID %u", id);
242 : : }
8373 243 : 2496 : do_end();
244 : : }
245 : : ;
246 : :
247 : : Boot_InsertStmt:
248 : : INSERT_TUPLE
249 : : {
250 : 413517 : do_start();
1972 andres@anarazel.de 251 [ - + ]: 413517 : elog(DEBUG4, "inserting row");
8373 peter_e@gmx.net 252 : 413517 : num_columns_read = 0;
253 : : }
254 : : LPAREN boot_column_val_list RPAREN
255 : : {
256 [ - + ]: 413517 : if (num_columns_read != numattr)
8373 peter_e@gmx.net 257 [ # # ]:UBC 0 : elog(ERROR, "incorrect number of columns in row (expected %d, got %d)",
258 : : numattr, num_columns_read);
7403 neilc@samurai.com 259 [ - + ]:CBC 413517 : if (boot_reldesc == NULL)
6248 alvherre@alvh.no-ip. 260 [ # # ]:UBC 0 : elog(FATAL, "relation not open");
1972 andres@anarazel.de 261 :CBC 413517 : InsertOneTuple();
8373 peter_e@gmx.net 262 : 413517 : do_end();
263 : : }
264 : : ;
265 : :
266 : : Boot_DeclareIndexStmt:
267 : : XDECLARE INDEX boot_ident oidspec ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
268 : : {
702 peter@eisentraut.org 269 : 546 : IndexStmt *stmt = makeNode(IndexStmt);
270 : : Oid relationId;
271 : :
2230 alvherre@alvh.no-ip. 272 [ - + ]: 546 : elog(DEBUG4, "creating index \"%s\"", $3);
273 : :
8373 peter_e@gmx.net 274 : 546 : do_start();
275 : :
4290 tgl@sss.pgh.pa.us 276 : 546 : stmt->idxname = $3;
277 : 546 : stmt->relation = makeRangeVar(NULL, $6, -1);
278 : 546 : stmt->accessMethod = $8;
279 : 546 : stmt->tableSpace = NULL;
280 : 546 : stmt->indexParams = $10;
2199 teodor@sigaev.ru 281 : 546 : stmt->indexIncludingParams = NIL;
4290 tgl@sss.pgh.pa.us 282 : 546 : stmt->options = NIL;
283 : 546 : stmt->whereClause = NULL;
284 : 546 : stmt->excludeOpNames = NIL;
285 : 546 : stmt->idxcomment = NULL;
286 : 546 : stmt->indexOid = InvalidOid;
648 rhaas@postgresql.org 287 : 546 : stmt->oldNumber = InvalidRelFileNumber;
1471 noah@leadboat.com 288 : 546 : stmt->oldCreateSubid = InvalidSubTransactionId;
648 rhaas@postgresql.org 289 : 546 : stmt->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
4290 tgl@sss.pgh.pa.us 290 : 546 : stmt->unique = false;
291 : 546 : stmt->primary = false;
292 : 546 : stmt->isconstraint = false;
293 : 546 : stmt->deferrable = false;
294 : 546 : stmt->initdeferred = false;
3339 295 : 546 : stmt->transformed = false;
4290 296 : 546 : stmt->concurrent = false;
3339 297 : 546 : stmt->if_not_exists = false;
1816 alvherre@alvh.no-ip. 298 : 546 : stmt->reset_default_tblspc = false;
299 : :
300 : : /* locks and races need not concern us in bootstrap mode */
3709 rhaas@postgresql.org 301 : 546 : relationId = RangeVarGetRelid(stmt->relation, NoLock,
302 : : false);
303 : :
304 : 546 : DefineIndex(relationId,
305 : : stmt,
6940 tgl@sss.pgh.pa.us 306 : 546 : $4,
307 : : InvalidOid,
308 : : InvalidOid,
309 : : -1,
310 : : false,
311 : : false,
312 : : false,
313 : : true, /* skip_build */
314 : : false);
8373 peter_e@gmx.net 315 : 546 : do_end();
316 : : }
317 : : ;
318 : :
319 : : Boot_DeclareUniqueIndexStmt:
320 : : XDECLARE UNIQUE INDEX boot_ident oidspec ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
321 : : {
702 peter@eisentraut.org 322 : 4290 : IndexStmt *stmt = makeNode(IndexStmt);
323 : : Oid relationId;
324 : :
2230 alvherre@alvh.no-ip. 325 [ - + ]: 4290 : elog(DEBUG4, "creating unique index \"%s\"", $4);
326 : :
8373 peter_e@gmx.net 327 : 4290 : do_start();
328 : :
4290 tgl@sss.pgh.pa.us 329 : 4290 : stmt->idxname = $4;
330 : 4290 : stmt->relation = makeRangeVar(NULL, $7, -1);
331 : 4290 : stmt->accessMethod = $9;
332 : 4290 : stmt->tableSpace = NULL;
333 : 4290 : stmt->indexParams = $11;
2199 teodor@sigaev.ru 334 : 4290 : stmt->indexIncludingParams = NIL;
4290 tgl@sss.pgh.pa.us 335 : 4290 : stmt->options = NIL;
336 : 4290 : stmt->whereClause = NULL;
337 : 4290 : stmt->excludeOpNames = NIL;
338 : 4290 : stmt->idxcomment = NULL;
339 : 4290 : stmt->indexOid = InvalidOid;
648 rhaas@postgresql.org 340 : 4290 : stmt->oldNumber = InvalidRelFileNumber;
1471 noah@leadboat.com 341 : 4290 : stmt->oldCreateSubid = InvalidSubTransactionId;
648 rhaas@postgresql.org 342 : 4290 : stmt->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
4290 tgl@sss.pgh.pa.us 343 : 4290 : stmt->unique = true;
344 : 4290 : stmt->primary = false;
345 : 4290 : stmt->isconstraint = false;
346 : 4290 : stmt->deferrable = false;
347 : 4290 : stmt->initdeferred = false;
3339 348 : 4290 : stmt->transformed = false;
4290 349 : 4290 : stmt->concurrent = false;
3339 350 : 4290 : stmt->if_not_exists = false;
1816 alvherre@alvh.no-ip. 351 : 4290 : stmt->reset_default_tblspc = false;
352 : :
353 : : /* locks and races need not concern us in bootstrap mode */
3709 rhaas@postgresql.org 354 : 4290 : relationId = RangeVarGetRelid(stmt->relation, NoLock,
355 : : false);
356 : :
357 : 4290 : DefineIndex(relationId,
358 : : stmt,
6940 tgl@sss.pgh.pa.us 359 : 4290 : $5,
360 : : InvalidOid,
361 : : InvalidOid,
362 : : -1,
363 : : false,
364 : : false,
365 : : false,
366 : : true, /* skip_build */
367 : : false);
8373 peter_e@gmx.net 368 : 4290 : do_end();
369 : : }
370 : : ;
371 : :
372 : : Boot_DeclareToastStmt:
373 : : XDECLARE XTOAST oidspec oidspec ON boot_ident
374 : : {
2230 alvherre@alvh.no-ip. 375 [ - + ]: 1404 : elog(DEBUG4, "creating toast table for table \"%s\"", $6);
376 : :
6467 tgl@sss.pgh.pa.us 377 : 1404 : do_start();
378 : :
5313 379 : 1404 : BootstrapToastTable($6, $3, $4);
6467 380 : 1404 : do_end();
381 : : }
382 : : ;
383 : :
384 : : Boot_BuildIndsStmt:
385 : : XBUILD INDICES
386 : : {
7211 387 : 39 : do_start();
388 : 39 : build_indices();
389 : 39 : do_end();
390 : : }
391 : : ;
392 : :
393 : :
394 : : boot_index_params:
9370 bruce@momjian.us 395 : 3159 : boot_index_params COMMA boot_index_param { $$ = lappend($1, $3); }
7263 neilc@samurai.com 396 : 4836 : | boot_index_param { $$ = list_make1($1); }
397 : : ;
398 : :
399 : : boot_index_param:
400 : : boot_ident boot_ident
401 : : {
702 peter@eisentraut.org 402 : 7995 : IndexElem *n = makeNode(IndexElem);
403 : :
5313 tgl@sss.pgh.pa.us 404 : 7995 : n->name = $1;
7627 405 : 7995 : n->expr = NULL;
5226 406 : 7995 : n->indexcolname = NULL;
4768 407 : 7995 : n->collation = NIL;
5313 408 : 7995 : n->opclass = list_make1(makeString($2));
6305 409 : 7995 : n->ordering = SORTBY_DEFAULT;
410 : 7995 : n->nulls_ordering = SORTBY_NULLS_DEFAULT;
9715 bruce@momjian.us 411 : 7995 : $$ = n;
412 : : }
413 : : ;
414 : :
415 : : optbootstrap:
416 : 156 : XBOOTSTRAP { $$ = 1; }
417 : 2340 : | { $$ = 0; }
418 : : ;
419 : :
420 : : optsharedrelation:
8023 tgl@sss.pgh.pa.us 421 : 429 : XSHARED_RELATION { $$ = 1; }
422 : 2067 : | { $$ = 0; }
423 : : ;
424 : :
425 : : optrowtypeoid:
5314 426 : 351 : XROWTYPE_OID oidspec { $$ = $2; }
427 : 2145 : | { $$ = InvalidOid; }
428 : : ;
429 : :
430 : : boot_column_list:
431 : : boot_column_def
432 : : | boot_column_list COMMA boot_column_def
433 : : ;
434 : :
435 : : boot_column_def:
436 : : boot_ident EQUALS boot_ident boot_column_nullness
437 : : {
7572 438 [ - + ]: 23361 : if (++numattr > MAXATTR)
8373 peter_e@gmx.net 439 [ # # ]:UBC 0 : elog(FATAL, "too many columns");
3340 andres@anarazel.de 440 :CBC 23361 : DefineAttr($1, $3, numattr-1, $4);
441 : : }
442 : : ;
443 : :
444 : : boot_column_nullness:
445 : 1326 : XFORCE XNOT XNULL { $$ = BOOTCOL_NULL_FORCE_NOT_NULL; }
446 : 156 : | XFORCE XNULL { $$ = BOOTCOL_NULL_FORCE_NULL; }
447 : 21879 : | { $$ = BOOTCOL_NULL_AUTO; }
448 : : ;
449 : :
450 : : oidspec:
5313 tgl@sss.pgh.pa.us 451 : 10491 : boot_ident { $$ = atooid($1); }
452 : : ;
453 : :
454 : : boot_column_val_list:
455 : : boot_column_val
456 : : | boot_column_val_list boot_column_val
457 : : | boot_column_val_list COMMA boot_column_val
458 : : ;
459 : :
460 : : boot_column_val:
461 : : boot_ident
462 : 4925358 : { InsertOneValue($1, num_columns_read++); }
463 : : | NULLVAL
8373 peter_e@gmx.net 464 : 1209030 : { InsertOneNull(num_columns_read++); }
465 : : ;
466 : :
467 : : boot_ident:
2171 tgl@sss.pgh.pa.us 468 : 5021805 : ID { $$ = $1; }
2171 tgl@sss.pgh.pa.us 469 :UBC 0 : | OPEN { $$ = pstrdup($1); }
470 : 0 : | XCLOSE { $$ = pstrdup($1); }
471 : 0 : | XCREATE { $$ = pstrdup($1); }
472 : 0 : | INSERT_TUPLE { $$ = pstrdup($1); }
473 : 0 : | XDECLARE { $$ = pstrdup($1); }
474 : 0 : | INDEX { $$ = pstrdup($1); }
475 : 0 : | ON { $$ = pstrdup($1); }
476 : 0 : | USING { $$ = pstrdup($1); }
477 : 0 : | XBUILD { $$ = pstrdup($1); }
478 : 0 : | INDICES { $$ = pstrdup($1); }
479 : 0 : | UNIQUE { $$ = pstrdup($1); }
480 : 0 : | XTOAST { $$ = pstrdup($1); }
481 : 0 : | OBJ_ID { $$ = pstrdup($1); }
482 : 0 : | XBOOTSTRAP { $$ = pstrdup($1); }
483 : 0 : | XSHARED_RELATION { $$ = pstrdup($1); }
484 : 0 : | XROWTYPE_OID { $$ = pstrdup($1); }
485 : 0 : | XFORCE { $$ = pstrdup($1); }
486 : 0 : | XNOT { $$ = pstrdup($1); }
487 : 0 : | XNULL { $$ = pstrdup($1); }
488 : : ;
489 : : %%
|