325 lines
5.9 KiB
Plaintext
325 lines
5.9 KiB
Plaintext
%{
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* backendparse.y--
|
|
* yacc parser grammer for the "backend" initialization program.
|
|
*
|
|
* Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.10 1997/12/17 18:21:37 momjian Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "catalog/pg_attribute.h"
|
|
#include "access/attnum.h"
|
|
#include "nodes/pg_list.h"
|
|
#include "access/tupdesc.h"
|
|
#include "storage/fd.h"
|
|
#include "catalog/pg_am.h"
|
|
#include "catalog/pg_class.h"
|
|
#include "nodes/nodes.h"
|
|
#include "rewrite/prs2lock.h"
|
|
#include "access/skey.h"
|
|
#include "access/strat.h"
|
|
#include "utils/rel.h"
|
|
|
|
#include "nodes/primnodes.h"
|
|
#include <time.h>
|
|
#include "utils/nabstime.h"
|
|
#include "storage/block.h"
|
|
#include "storage/off.h"
|
|
#include "storage/itemptr.h"
|
|
#include "access/htup.h"
|
|
#include "nodes/parsenodes.h"
|
|
|
|
#include "access/xact.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "catalog/heap.h"
|
|
|
|
#include "storage/ipc.h"
|
|
#include "storage/spin.h"
|
|
#include "storage/smgr.h"
|
|
|
|
#include "tcop/dest.h"
|
|
#include "commands/defrem.h"
|
|
|
|
#include "access/itup.h"
|
|
#include "access/funcindex.h"
|
|
#include "bootstrap/bootstrap.h"
|
|
|
|
#include "miscadmin.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> arg_list
|
|
%type <ielem> index_params index_on
|
|
%type <ival> const ident
|
|
%type <ival> optbootstrap optoideq tuple tuplelist
|
|
|
|
%token <ival> CONST ID
|
|
%token OPEN XCLOSE XCREATE INSERT_TUPLE
|
|
%token STRING XDEFINE
|
|
%token XDECLARE INDEX ON USING XBUILD INDICES
|
|
%token COMMA EQUALS LPAREN RPAREN
|
|
%token OBJ_ID XBOOTSTRAP NULLVAL
|
|
%start TopLevel
|
|
|
|
%nonassoc low
|
|
%nonassoc high
|
|
|
|
%%
|
|
|
|
TopLevel:
|
|
Queries
|
|
|
|
|
;
|
|
|
|
Queries:
|
|
A_Query
|
|
| Queries A_Query
|
|
;
|
|
|
|
A_Query :
|
|
OpenStmt
|
|
| CloseStmt
|
|
| CreateStmt
|
|
| InsertStmt
|
|
| DeclareIndexStmt
|
|
| BuildIndsStmt
|
|
;
|
|
|
|
OpenStmt:
|
|
OPEN ident
|
|
{
|
|
DO_START;
|
|
boot_openrel(LexIDStr($2));
|
|
DO_END;
|
|
}
|
|
;
|
|
|
|
CloseStmt:
|
|
XCLOSE ident %prec low
|
|
{
|
|
DO_START;
|
|
closerel(LexIDStr($2));
|
|
DO_END;
|
|
}
|
|
| XCLOSE %prec high
|
|
{
|
|
DO_START;
|
|
closerel(NULL);
|
|
DO_END;
|
|
}
|
|
;
|
|
|
|
CreateStmt:
|
|
XCREATE optbootstrap ident LPAREN
|
|
{
|
|
DO_START;
|
|
numattr=(int)0;
|
|
}
|
|
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);
|
|
if (DebugMode)
|
|
puts("bootstrap relation created ok");
|
|
}
|
|
else
|
|
{
|
|
Oid id;
|
|
TupleDesc tupdesc;
|
|
/* extern Oid heap_create_with_catalog();*/
|
|
|
|
tupdesc = CreateTupleDesc(numattr,attrtypes);
|
|
id = heap_create_with_catalog(LexIDStr($3), tupdesc);
|
|
if (!Quiet)
|
|
printf("CREATED relation %s with OID %d\n",
|
|
LexIDStr($3), id);
|
|
}
|
|
DO_END;
|
|
if (DebugMode)
|
|
puts("Commit End");
|
|
}
|
|
;
|
|
|
|
InsertStmt:
|
|
INSERT_TUPLE optoideq
|
|
{
|
|
DO_START;
|
|
if (DebugMode)
|
|
printf("tuple %d<", $2);
|
|
num_tuples_read = 0;
|
|
}
|
|
LPAREN tuplelist RPAREN
|
|
{
|
|
if (num_tuples_read != numattr)
|
|
elog(WARN,"incorrect number of values for tuple");
|
|
if (reldesc == (Relation)NULL)
|
|
{
|
|
elog(WARN,"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");
|
|
}
|
|
;
|
|
|
|
DeclareIndexStmt:
|
|
XDECLARE INDEX ident ON ident USING ident LPAREN index_params RPAREN
|
|
{
|
|
List *params;
|
|
|
|
DO_START;
|
|
|
|
params = lappend(NIL, (List*)$9);
|
|
DefineIndex(LexIDStr($5),
|
|
LexIDStr($3),
|
|
LexIDStr($7),
|
|
params, NIL, 0, 0, NIL);
|
|
DO_END;
|
|
}
|
|
;
|
|
|
|
BuildIndsStmt:
|
|
XBUILD INDICES { build_indices(); }
|
|
|
|
index_params:
|
|
index_on ident
|
|
{
|
|
IndexElem *n = (IndexElem*)$1;
|
|
n->class = LexIDStr($2);
|
|
$$ = n;
|
|
}
|
|
|
|
index_on:
|
|
ident
|
|
{
|
|
IndexElem *n = makeNode(IndexElem);
|
|
n->name = LexIDStr($1);
|
|
$$ = n;
|
|
}
|
|
| ident LPAREN arg_list RPAREN
|
|
{
|
|
IndexElem *n = makeNode(IndexElem);
|
|
n->name = LexIDStr($1);
|
|
n->args = (List*)$3;
|
|
$$ = n;
|
|
}
|
|
|
|
arg_list:
|
|
ident
|
|
{
|
|
$$ = lappend(NIL, makeString(LexIDStr($1)));
|
|
}
|
|
| arg_list COMMA ident
|
|
{
|
|
$$ = lappend((List*)$1, makeString(LexIDStr($3)));
|
|
}
|
|
|
|
optbootstrap:
|
|
XBOOTSTRAP { $$ = 1; }
|
|
| { $$ = 0; }
|
|
;
|
|
|
|
typelist:
|
|
typething
|
|
| typelist COMMA typething
|
|
;
|
|
|
|
typething:
|
|
ident EQUALS 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 ident { $$ = atol(LexIDStr($3)); }
|
|
| { extern Oid newoid(); $$ = newoid(); }
|
|
;
|
|
|
|
tuplelist:
|
|
tuple
|
|
| tuplelist tuple
|
|
| tuplelist COMMA tuple
|
|
;
|
|
|
|
tuple:
|
|
ident {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
|
|
| const {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
|
|
| NULLVAL
|
|
{ InsertOneNull(num_tuples_read++); }
|
|
;
|
|
|
|
const :
|
|
CONST { $$=yylval.ival; }
|
|
;
|
|
|
|
ident :
|
|
ID { $$=yylval.ival; }
|
|
;
|
|
%%
|