mirror of
https://github.com/postgres/postgres.git
synced 2025-06-10 09:21:54 +03:00
materialized tupleset is small enough) instead of a temporary relation. This was something I was thinking of doing anyway for performance, and Jan says he needs it for TOAST because he doesn't want to cope with toasting noname relations. With this change, the 'noname table' support in heap.c is dead code, and I have accordingly removed it. Also clean up 'noname' plan handling in planner --- nonames are either sort or materialize plans, and it seems less confusing to handle them separately under those names.
313 lines
6.1 KiB
Plaintext
313 lines
6.1 KiB
Plaintext
%{
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* backendparse.y
|
|
* yacc parser grammer for the "backend" initialization program.
|
|
*
|
|
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.30 2000/06/18 22:43:51 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include <time.h>
|
|
|
|
#include "postgres.h"
|
|
|
|
|
|
#include "access/attnum.h"
|
|
#include "access/funcindex.h"
|
|
#include "access/htup.h"
|
|
#include "access/itup.h"
|
|
#include "access/skey.h"
|
|
#include "access/strat.h"
|
|
#include "access/tupdesc.h"
|
|
#include "access/xact.h"
|
|
#include "bootstrap/bootstrap.h"
|
|
#include "catalog/heap.h"
|
|
#include "catalog/pg_am.h"
|
|
#include "catalog/pg_attribute.h"
|
|
#include "catalog/pg_class.h"
|
|
#include "commands/defrem.h"
|
|
#include "miscadmin.h"
|
|
#include "nodes/nodes.h"
|
|
#include "nodes/parsenodes.h"
|
|
#include "nodes/pg_list.h"
|
|
#include "nodes/primnodes.h"
|
|
#include "rewrite/prs2lock.h"
|
|
#include "storage/block.h"
|
|
#include "storage/fd.h"
|
|
#include "storage/ipc.h"
|
|
#include "storage/itemptr.h"
|
|
#include "storage/off.h"
|
|
#include "storage/smgr.h"
|
|
#include "storage/spin.h"
|
|
#include "tcop/dest.h"
|
|
#include "utils/nabstime.h"
|
|
#include "utils/rel.h"
|
|
|
|
#define DO_START { \
|
|
StartTransactionCommand();\
|
|
}
|
|
|
|
#define DO_END { \
|
|
CommitTransactionCommand();\
|
|
if (!Quiet) { EMITPROMPT; }\
|
|
fflush(stdout); \
|
|
}
|
|
|
|
int num_tuples_read = 0;
|
|
static Oid objectid;
|
|
|
|
%}
|
|
|
|
%union
|
|
{
|
|
List *list;
|
|
IndexElem *ielem;
|
|
char *str;
|
|
int ival;
|
|
}
|
|
|
|
%type <list> boot_index_params
|
|
%type <ielem> boot_index_param
|
|
%type <ival> boot_const boot_ident
|
|
%type <ival> optbootstrap optoideq boot_tuple boot_tuplelist
|
|
|
|
%token <ival> CONST ID
|
|
%token OPEN XCLOSE XCREATE INSERT_TUPLE
|
|
%token STRING XDEFINE
|
|
%token XDECLARE INDEX ON USING XBUILD INDICES UNIQUE
|
|
%token COMMA EQUALS LPAREN RPAREN
|
|
%token OBJ_ID XBOOTSTRAP NULLVAL
|
|
%start TopLevel
|
|
|
|
%nonassoc low
|
|
%nonassoc high
|
|
|
|
%%
|
|
|
|
TopLevel:
|
|
Boot_Queries
|
|
|
|
|
;
|
|
|
|
Boot_Queries:
|
|
Boot_Query
|
|
| Boot_Queries Boot_Query
|
|
;
|
|
|
|
Boot_Query :
|
|
Boot_OpenStmt
|
|
| Boot_CloseStmt
|
|
| Boot_CreateStmt
|
|
| Boot_InsertStmt
|
|
| Boot_DeclareIndexStmt
|
|
| Boot_DeclareUniqueIndexStmt
|
|
| Boot_BuildIndsStmt
|
|
;
|
|
|
|
Boot_OpenStmt:
|
|
OPEN boot_ident
|
|
{
|
|
DO_START;
|
|
boot_openrel(LexIDStr($2));
|
|
DO_END;
|
|
}
|
|
;
|
|
|
|
Boot_CloseStmt:
|
|
XCLOSE boot_ident %prec low
|
|
{
|
|
DO_START;
|
|
closerel(LexIDStr($2));
|
|
DO_END;
|
|
}
|
|
| XCLOSE %prec high
|
|
{
|
|
DO_START;
|
|
closerel(NULL);
|
|
DO_END;
|
|
}
|
|
;
|
|
|
|
Boot_CreateStmt:
|
|
XCREATE optbootstrap boot_ident LPAREN
|
|
{
|
|
DO_START;
|
|
numattr=(int)0;
|
|
}
|
|
boot_typelist
|
|
{
|
|
if (!Quiet)
|
|
putchar('\n');
|
|
DO_END;
|
|
}
|
|
RPAREN
|
|
{
|
|
DO_START;
|
|
|
|
if ($2)
|
|
{
|
|
extern Relation reldesc;
|
|
TupleDesc tupdesc;
|
|
|
|
if (reldesc)
|
|
{
|
|
puts("create bootstrap: Warning, open relation");
|
|
puts("exists, closing first");
|
|
closerel(NULL);
|
|
}
|
|
if (DebugMode)
|
|
puts("creating bootstrap relation");
|
|
tupdesc = CreateTupleDesc(numattr,attrtypes);
|
|
reldesc = heap_create(LexIDStr($3), tupdesc,
|
|
false, true);
|
|
if (DebugMode)
|
|
puts("bootstrap relation created ok");
|
|
}
|
|
else
|
|
{
|
|
Oid id;
|
|
TupleDesc tupdesc;
|
|
|
|
tupdesc = CreateTupleDesc(numattr,attrtypes);
|
|
id = heap_create_with_catalog(LexIDStr($3),
|
|
tupdesc, RELKIND_RELATION, false);
|
|
if (!Quiet)
|
|
printf("CREATED relation %s with OID %u\n",
|
|
LexIDStr($3), id);
|
|
}
|
|
DO_END;
|
|
if (DebugMode)
|
|
puts("Commit End");
|
|
}
|
|
;
|
|
|
|
Boot_InsertStmt:
|
|
INSERT_TUPLE optoideq
|
|
{
|
|
DO_START;
|
|
if (DebugMode)
|
|
printf("tuple %d<", $2);
|
|
num_tuples_read = 0;
|
|
}
|
|
LPAREN boot_tuplelist RPAREN
|
|
{
|
|
if (num_tuples_read != numattr)
|
|
elog(ERROR,"incorrect number of values for tuple");
|
|
if (reldesc == (Relation)NULL)
|
|
{
|
|
elog(ERROR,"must OPEN RELATION before INSERT\n");
|
|
err_out();
|
|
}
|
|
if (DebugMode)
|
|
puts("Insert Begin");
|
|
objectid = $2;
|
|
InsertOneTuple(objectid);
|
|
if (DebugMode)
|
|
puts("Insert End");
|
|
if (!Quiet)
|
|
putchar('\n');
|
|
DO_END;
|
|
if (DebugMode)
|
|
puts("Transaction End");
|
|
}
|
|
;
|
|
|
|
Boot_DeclareIndexStmt:
|
|
XDECLARE INDEX boot_ident ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
|
|
{
|
|
DO_START;
|
|
|
|
DefineIndex(LexIDStr($5),
|
|
LexIDStr($3),
|
|
LexIDStr($7),
|
|
$9, NIL, 0, 0, 0, NIL);
|
|
DO_END;
|
|
}
|
|
;
|
|
|
|
Boot_DeclareUniqueIndexStmt:
|
|
XDECLARE UNIQUE INDEX boot_ident ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
|
|
{
|
|
DO_START;
|
|
|
|
DefineIndex(LexIDStr($6),
|
|
LexIDStr($4),
|
|
LexIDStr($8),
|
|
$10, NIL, 1, 0, 0, NIL);
|
|
DO_END;
|
|
}
|
|
;
|
|
|
|
Boot_BuildIndsStmt:
|
|
XBUILD INDICES { build_indices(); }
|
|
|
|
|
|
boot_index_params:
|
|
boot_index_params COMMA boot_index_param { $$ = lappend($1, $3); }
|
|
| boot_index_param { $$ = lcons($1, NIL); }
|
|
;
|
|
|
|
boot_index_param:
|
|
boot_ident boot_ident
|
|
{
|
|
IndexElem *n = makeNode(IndexElem);
|
|
n->name = LexIDStr($1);
|
|
n->class = LexIDStr($2);
|
|
$$ = n;
|
|
}
|
|
|
|
optbootstrap:
|
|
XBOOTSTRAP { $$ = 1; }
|
|
| { $$ = 0; }
|
|
;
|
|
|
|
boot_typelist:
|
|
boot_type_thing
|
|
| boot_typelist COMMA boot_type_thing
|
|
;
|
|
|
|
boot_type_thing:
|
|
boot_ident EQUALS boot_ident
|
|
{
|
|
if(++numattr > MAXATTR)
|
|
elog(FATAL,"Too many attributes\n");
|
|
DefineAttr(LexIDStr($1),LexIDStr($3),numattr-1);
|
|
if (DebugMode)
|
|
printf("\n");
|
|
}
|
|
;
|
|
|
|
optoideq:
|
|
OBJ_ID EQUALS boot_ident { $$ = atol(LexIDStr($3)); }
|
|
| { extern Oid newoid(); $$ = newoid(); }
|
|
;
|
|
|
|
boot_tuplelist:
|
|
boot_tuple
|
|
| boot_tuplelist boot_tuple
|
|
| boot_tuplelist COMMA boot_tuple
|
|
;
|
|
|
|
boot_tuple:
|
|
boot_ident {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
|
|
| boot_const {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
|
|
| NULLVAL
|
|
{ InsertOneNull(num_tuples_read++); }
|
|
;
|
|
|
|
boot_const :
|
|
CONST { $$=yylval.ival; }
|
|
;
|
|
|
|
boot_ident :
|
|
ID { $$=yylval.ival; }
|
|
;
|
|
%%
|