⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootparse.y

📁 关系型数据库 Postgresql 6.5.2
💻 Y
字号:
%{/*------------------------------------------------------------------------- * * backendparse.y *	  yacc parser grammer for the "backend" initialization program. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION *	  $Header: /usr/local/cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.25.2.1 1999/08/02 05:56:51 scrappy 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%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_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, false);						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_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; }		;%%

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -