bootparse.y
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. %{
  2. /*-------------------------------------------------------------------------
  3.  *
  4.  * backendparse.y
  5.  *   yacc parser grammer for the "backend" initialization program.
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  *
  10.  * IDENTIFICATION
  11.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.25.2.1 1999/08/02 05:56:51 scrappy Exp $
  12.  *
  13.  *-------------------------------------------------------------------------
  14.  */
  15. #include <time.h>
  16. #include "postgres.h"
  17. #include "access/attnum.h"
  18. #include "access/funcindex.h"
  19. #include "access/htup.h"
  20. #include "access/itup.h"
  21. #include "access/skey.h"
  22. #include "access/strat.h"
  23. #include "access/tupdesc.h"
  24. #include "access/xact.h"
  25. #include "bootstrap/bootstrap.h"
  26. #include "catalog/heap.h"
  27. #include "catalog/pg_am.h"
  28. #include "catalog/pg_attribute.h"
  29. #include "catalog/pg_class.h"
  30. #include "commands/defrem.h"
  31. #include "miscadmin.h"
  32. #include "nodes/nodes.h"
  33. #include "nodes/parsenodes.h"
  34. #include "nodes/pg_list.h"
  35. #include "nodes/primnodes.h"
  36. #include "rewrite/prs2lock.h"
  37. #include "storage/block.h"
  38. #include "storage/fd.h"
  39. #include "storage/ipc.h"
  40. #include "storage/itemptr.h"
  41. #include "storage/off.h"
  42. #include "storage/smgr.h"
  43. #include "storage/spin.h"
  44. #include "tcop/dest.h"
  45. #include "utils/nabstime.h"
  46. #include "utils/rel.h"
  47. #define DO_START { 
  48. StartTransactionCommand();
  49.  }
  50. #define DO_END  { 
  51. CommitTransactionCommand();
  52. if (!Quiet) { EMITPROMPT; }
  53. fflush(stdout); 
  54.  }
  55. int num_tuples_read = 0;
  56. static Oid objectid;
  57. %}
  58. %union
  59. {
  60. List *list;
  61. IndexElem *ielem;
  62. char *str;
  63. int ival;
  64. }
  65. %type <list>  boot_index_params
  66. %type <ielem> boot_index_param
  67. %type <ival> boot_const boot_ident
  68. %type <ival> optbootstrap optoideq boot_tuple boot_tuplelist
  69. %token <ival> CONST ID
  70. %token OPEN XCLOSE XCREATE INSERT_TUPLE
  71. %token STRING XDEFINE
  72. %token XDECLARE INDEX ON USING XBUILD INDICES
  73. %token COMMA EQUALS LPAREN RPAREN
  74. %token OBJ_ID XBOOTSTRAP NULLVAL
  75. %start TopLevel
  76. %nonassoc low
  77. %nonassoc high
  78. %%
  79. TopLevel:
  80.   Boot_Queries
  81. |
  82. ;
  83. Boot_Queries:
  84.   Boot_Query
  85. | Boot_Queries Boot_Query
  86. ;
  87. Boot_Query :
  88.   Boot_OpenStmt
  89. | Boot_CloseStmt
  90. | Boot_CreateStmt
  91. | Boot_InsertStmt
  92. | Boot_DeclareIndexStmt
  93. | Boot_BuildIndsStmt
  94. ;
  95. Boot_OpenStmt:
  96.   OPEN boot_ident
  97. {
  98. DO_START;
  99. boot_openrel(LexIDStr($2));
  100. DO_END;
  101. }
  102. ;
  103. Boot_CloseStmt:
  104.   XCLOSE boot_ident %prec low
  105. {
  106. DO_START;
  107. closerel(LexIDStr($2));
  108. DO_END;
  109. }
  110. | XCLOSE %prec high
  111. {
  112. DO_START;
  113. closerel(NULL);
  114. DO_END;
  115. }
  116. ;
  117. Boot_CreateStmt:
  118.   XCREATE optbootstrap boot_ident LPAREN
  119. {
  120. DO_START;
  121. numattr=(int)0;
  122. }
  123.   boot_typelist
  124. {
  125. if (!Quiet)
  126. putchar('n');
  127. DO_END;
  128. }
  129.   RPAREN
  130. {
  131. DO_START;
  132. if ($2)
  133. {
  134. extern Relation reldesc;
  135. TupleDesc tupdesc;
  136. if (reldesc)
  137. {
  138. puts("create bootstrap: Warning, open relation");
  139. puts("exists, closing first");
  140. closerel(NULL);
  141. }
  142. if (DebugMode)
  143. puts("creating bootstrap relation");
  144. tupdesc = CreateTupleDesc(numattr,attrtypes);
  145. reldesc = heap_create(LexIDStr($3), tupdesc,
  146.   false, false);
  147. if (DebugMode)
  148. puts("bootstrap relation created ok");
  149. }
  150. else
  151. {
  152. Oid id;
  153. TupleDesc tupdesc;
  154. tupdesc = CreateTupleDesc(numattr,attrtypes);
  155. id = heap_create_with_catalog(LexIDStr($3),
  156. tupdesc, RELKIND_RELATION, false);
  157. if (!Quiet)
  158. printf("CREATED relation %s with OID %un",
  159.    LexIDStr($3), id);
  160. }
  161. DO_END;
  162. if (DebugMode)
  163. puts("Commit End");
  164. }
  165. ;
  166. Boot_InsertStmt:
  167.   INSERT_TUPLE optoideq
  168. {
  169. DO_START;
  170. if (DebugMode)
  171. printf("tuple %d<", $2);
  172. num_tuples_read = 0;
  173. }
  174.   LPAREN  boot_tuplelist RPAREN
  175. {
  176. if (num_tuples_read != numattr)
  177. elog(ERROR,"incorrect number of values for tuple");
  178. if (reldesc == (Relation)NULL)
  179. {
  180. elog(ERROR,"must OPEN RELATION before INSERTn");
  181. err_out();
  182. }
  183. if (DebugMode)
  184. puts("Insert Begin");
  185. objectid = $2;
  186. InsertOneTuple(objectid);
  187. if (DebugMode)
  188. puts("Insert End");
  189. if (!Quiet)
  190. putchar('n');
  191. DO_END;
  192. if (DebugMode)
  193. puts("Transaction End");
  194. }
  195. ;
  196. Boot_DeclareIndexStmt:
  197.   XDECLARE INDEX boot_ident ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
  198. {
  199. DO_START;
  200. DefineIndex(LexIDStr($5),
  201. LexIDStr($3),
  202. LexIDStr($7),
  203. $9, NIL, 0, 0, 0, NIL);
  204. DO_END;
  205. }
  206. ;
  207. Boot_BuildIndsStmt:
  208.   XBUILD INDICES { build_indices(); }
  209. boot_index_params:
  210. boot_index_params COMMA boot_index_param { $$ = lappend($1, $3); }
  211. | boot_index_param { $$ = lcons($1, NIL); }
  212. ;
  213. boot_index_param:
  214. boot_ident boot_ident
  215. {
  216. IndexElem *n = makeNode(IndexElem);
  217. n->name = LexIDStr($1);
  218. n->class = LexIDStr($2);
  219. $$ = n;
  220. }
  221. optbootstrap:
  222. XBOOTSTRAP { $$ = 1; }
  223. | { $$ = 0; }
  224. ;
  225. boot_typelist:
  226.   boot_type_thing
  227. | boot_typelist COMMA boot_type_thing
  228. ;
  229. boot_type_thing:
  230.   boot_ident EQUALS boot_ident
  231. {
  232.    if(++numattr > MAXATTR)
  233. elog(FATAL,"Too many attributesn");
  234.    DefineAttr(LexIDStr($1),LexIDStr($3),numattr-1);
  235.    if (DebugMode)
  236.    printf("n");
  237. }
  238. ;
  239. optoideq:
  240. OBJ_ID EQUALS boot_ident { $$ = atol(LexIDStr($3)); }
  241. | { extern Oid newoid(); $$ = newoid(); }
  242. ;
  243. boot_tuplelist:
  244.    boot_tuple
  245. |  boot_tuplelist boot_tuple
  246. |  boot_tuplelist COMMA boot_tuple
  247. ;
  248. boot_tuple:
  249.   boot_ident {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
  250. | boot_const {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
  251. | NULLVAL
  252. { InsertOneNull(num_tuples_read++); }
  253. ;
  254. boot_const :
  255.   CONST { $$=yylval.ival; }
  256. ;
  257. boot_ident :
  258.   ID { $$=yylval.ival; }
  259. ;
  260. %%