parse.y 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. /*
  2. ** Copyright (c) 2011 D. Richard Hipp
  3. **
  4. ** This program is free software; you can redistribute it and/or
  5. ** modify it under the terms of the Simplified BSD License (also
  6. ** known as the "2-Clause License" or "FreeBSD License".)
  7. **
  8. ** This program is distributed in the hope that it will be useful,
  9. ** but without any warranty; without even the implied warranty of
  10. ** merchantability or fitness for a particular purpose.
  11. **
  12. ** Author contact information:
  13. ** [email protected]
  14. ** http://www.hwaci.com/drh/
  15. **
  16. *****************************************************************************
  17. ** Language grammar
  18. */
  19. // All token codes are small integers with #defines that begin with "TK_"
  20. %token_prefix TK_
  21. // The type of the data attached to each token is Token. This is also the
  22. // default type for non-terminals.
  23. //
  24. %token_type {Token}
  25. %default_type {Token}
  26. // The generated parser function takes a 4th argument as follows:
  27. %extra_argument {Parse *p}
  28. // The name of the generated procedure that implements the parser
  29. // is as follows:
  30. %name xjd1Parser
  31. // Handle syntax errors.
  32. %syntax_error {
  33. xjd1ParseError(p, XJD1_SYNTAX,
  34. "syntax error near \"%.*s\"", p->sTok.n, p->sTok.z
  35. );
  36. }
  37. // The following text is included near the beginning of the C source
  38. // code file that implements the parser.
  39. //
  40. %include {
  41. #include "xjd1Int.h"
  42. /*
  43. ** Disable all error recovery processing in the parser push-down
  44. ** automaton.
  45. */
  46. #define YYNOERRORRECOVERY 1
  47. /*
  48. ** Make yytestcase() be a no-op
  49. */
  50. #define yytestcase(X)
  51. } // end %include
  52. // Input is a single XJD1 command
  53. %type cmd {Command*}
  54. %destructor cmd {(void)p;}
  55. input ::= cmd(X) SEMI. {p->pCmd = X;}
  56. /////////////////////////// Expression Processing /////////////////////////////
  57. //
  58. %include {
  59. /* A JSON literal for a real number */
  60. static JsonNode *jsonReal(Parse *p, Token *pTok){
  61. JsonNode *pNew = xjd1JsonNew(p->pPool);
  62. if( pNew ){
  63. pNew->eJType = XJD1_REAL;
  64. pNew->u.r = atof(pTok->z);
  65. }
  66. return pNew;
  67. }
  68. /* Convert a token into a zero-terminated string */
  69. static char *tokenStr(Parse *p, Token *pTok){
  70. char *z;
  71. if( pTok ){
  72. z = xjd1PoolDup(p->pPool, pTok->z, pTok->n);
  73. if( z && z[0]=='"' ) xjd1DequoteString(z, pTok->n);
  74. }else{
  75. z = 0;
  76. }
  77. return z;
  78. }
  79. /* A JSON literal for a string */
  80. static JsonNode *jsonString(Parse *p, Token *pTok){
  81. JsonNode *pNew = xjd1JsonNew(p->pPool);
  82. if( pNew ){
  83. pNew->eJType = XJD1_STRING;
  84. pNew->u.z = tokenStr(p, pTok);
  85. }
  86. return pNew;
  87. }
  88. /* A JSON literal for a boolean or NULL */
  89. static JsonNode *jsonType(Parse *p, int eJType){
  90. JsonNode *pNew = xjd1JsonNew(p->pPool);
  91. if( pNew ){
  92. pNew->eJType = eJType;
  93. }
  94. return pNew;
  95. }
  96. }
  97. %type jvalue {JsonNode*}
  98. jvalue(A) ::= INTEGER(X). {A = jsonReal(p,&X);}
  99. jvalue(A) ::= FLOAT(X). {A = jsonReal(p,&X);}
  100. jvalue(A) ::= STRING(X). {A = jsonString(p,&X);}
  101. jvalue(A) ::= TRUE. {A = jsonType(p,XJD1_TRUE);}
  102. jvalue(A) ::= FALSE. {A = jsonType(p,XJD1_FALSE);}
  103. jvalue(A) ::= NULL. {A = jsonType(p,XJD1_NULL);}
  104. %right QM.
  105. %left OR.
  106. %left AND.
  107. %left BITOR.
  108. %left BITXOR.
  109. %left BITAND.
  110. %left ILIKEOP LIKEOP NE EQEQ EQ3 NE3.
  111. %left WITHIN IN GT LE LT GE.
  112. %left LSHIFT RSHIFT URSHIFT.
  113. %left PLUS MINUS.
  114. %left STAR SLASH REM.
  115. %right BITNOT BANG.
  116. %left COLLATE.
  117. %include {
  118. /* Generate an Expr object from an identifer token */
  119. static Expr *idExpr(Parse *p, Token *pTok){
  120. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  121. if( pNew ){
  122. pNew->eType = TK_ID;
  123. pNew->eClass = XJD1_EXPR_TK;
  124. pNew->u.id.zId = tokenStr(p, pTok);
  125. }
  126. return pNew;
  127. }
  128. /* Generate an Expr object that is a binary operator on two
  129. ** other Expr objects. */
  130. static Expr *biExpr(Parse *p, Expr *pLeft, int eOp, Expr *pRight){
  131. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  132. if( pNew ){
  133. pNew->eType = eOp;
  134. pNew->eClass = XJD1_EXPR_BI;
  135. pNew->u.bi.pLeft = pLeft;
  136. pNew->u.bi.pRight = pRight;
  137. }
  138. return pNew;
  139. }
  140. /* Generate an Expr object that is a tertiary operator */
  141. static Expr *triExpr(Parse *p, Expr *pTest, Expr *pTrue, Expr *pFalse){
  142. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  143. if( pNew ){
  144. pNew->eType = TK_QM;
  145. pNew->eClass = XJD1_EXPR_TRI;
  146. pNew->u.tri.pTest = pTest;
  147. pNew->u.tri.pIfTrue = pTrue;
  148. pNew->u.tri.pIfFalse = pFalse;
  149. }
  150. return pNew;
  151. }
  152. /* Generate an Expr object for an lvalue */
  153. static Expr *lvalueExpr(Parse *p, Expr *pLeft, Token *pId){
  154. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  155. if( pNew ){
  156. pNew->eType = TK_DOT;
  157. pNew->eClass = XJD1_EXPR_LVALUE;
  158. pNew->u.lvalue.pLeft = pLeft;
  159. pNew->u.lvalue.zId = tokenStr(p, pId);
  160. }
  161. return pNew;
  162. }
  163. /* Generate an Expr object that is a function call. */
  164. static Expr *funcExpr(Parse *p, Token *pFName, ExprList *pArgs){
  165. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  166. if( pNew ){
  167. pNew->eType = TK_FUNCTION;
  168. pNew->eClass = XJD1_EXPR_FUNC;
  169. pNew->u.func.zFName = tokenStr(p, pFName);
  170. if( pArgs==0 ){
  171. pArgs = xjd1PoolMallocZero(p->pPool, sizeof(ExprList));
  172. }
  173. pNew->u.func.args = pArgs;
  174. }
  175. return pNew;
  176. }
  177. /* Generate an Expr object that is a subquery. */
  178. static Expr *subqExpr(Parse *p, Query *pQuery){
  179. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  180. if( pNew ){
  181. pNew->eType = TK_SELECT;
  182. pNew->eClass = XJD1_EXPR_Q;
  183. pNew->u.subq.p = pQuery;
  184. }
  185. return pNew;
  186. }
  187. /* Generate an Expr object that is a structure */
  188. static Expr *stExpr(Parse *p, ExprList *pList){
  189. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  190. if( pNew ){
  191. pNew->eType = TK_STRUCT;
  192. pNew->eClass = XJD1_EXPR_STRUCT;
  193. if( pList ){
  194. pNew->u.st = pList;
  195. }else{
  196. pNew->u.st = (ExprList *)xjd1PoolMallocZero(p->pPool, sizeof(ExprList));
  197. }
  198. }
  199. return pNew;
  200. }
  201. /* Generate an Expr object that is an array7 */
  202. static Expr *arExpr(Parse *p, ExprList *pList){
  203. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  204. if( pNew ){
  205. pNew->eType = TK_ARRAY;
  206. pNew->eClass = XJD1_EXPR_ARRAY;
  207. if( pList ){
  208. pNew->u.ar = pList;
  209. }else{
  210. pNew->u.ar = (ExprList *)xjd1PoolMallocZero(p->pPool, sizeof(ExprList));
  211. }
  212. }
  213. return pNew;
  214. }
  215. /* Generate an Expr object that is JSON value literal */
  216. static Expr *jsonExpr(Parse *p, JsonNode *pNode){
  217. Expr *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  218. if( pNew ){
  219. pNew->eType = TK_JVALUE;
  220. pNew->eClass = XJD1_EXPR_JSON;
  221. pNew->u.json.p = pNode;
  222. }
  223. return pNew;
  224. }
  225. /* Append a new expression to an expression list. Allocate the
  226. ** expression list object if necessary. */
  227. static ExprList *apndExpr(Parse *p, ExprList *pList, Expr *pExpr, Token *pT){
  228. ExprItem *pItem;
  229. if( pList==0 ){
  230. pList = xjd1PoolMallocZero(p->pPool, sizeof(*pList)+4*sizeof(ExprItem));
  231. if( pList==0 ) return 0;
  232. pList->nEAlloc = 0;
  233. }
  234. if( pList->nEAlloc<=pList->nEItem ){
  235. ExprItem *pNew;
  236. int n = pList->nEAlloc*4;
  237. if( n==0 ) n = 10;
  238. pNew = xjd1PoolMalloc(p->pPool, sizeof(ExprItem)*n);
  239. if( pNew==0 ) return pList;
  240. memcpy(pNew, pList->apEItem, pList->nEItem*sizeof(ExprItem));
  241. pList->nEAlloc = n;
  242. pList->apEItem = pNew;
  243. }
  244. pItem = &pList->apEItem[pList->nEItem++];
  245. pItem->zAs = tokenStr(p, pT);
  246. pItem->pExpr = pExpr;
  247. return pList;
  248. }
  249. }
  250. %type lvalue {Expr*}
  251. lvalue(A) ::= ID(X). {A = idExpr(p,&X);}
  252. lvalue(A) ::= lvalue(X) DOT ID(Y). {A = lvalueExpr(p,X,&Y);}
  253. lvalue(A) ::= lvalue(X) LB expr(Y) RB. {A = biExpr(p,X,TK_LB,Y);}
  254. %type expr {Expr*}
  255. expr(A) ::= lvalue(X). {A = X;}
  256. expr(A) ::= jvalue(X). {A = jsonExpr(p,X);}
  257. expr(A) ::= LC structlist(X) RC. {A = stExpr(p,X);}
  258. expr(A) ::= LC RC. {A = stExpr(p,0);}
  259. expr(A) ::= LB arraylist(X) RB. {A = arExpr(p,X);}
  260. expr(A) ::= LB RB. {A = arExpr(p,0);}
  261. %type structlist {ExprList*}
  262. structlist(A) ::= ID|STRING(Y) COLON expr(Z). {A = apndExpr(p,0,Z,&Y);}
  263. structlist(A) ::= structlist(X) COMMA ID|STRING(Y) COLON expr(Z).
  264. {A = apndExpr(p,X,Z,&Y);}
  265. %type arraylist {ExprList*}
  266. arraylist(A) ::= expr(Y). {A = apndExpr(p,0,Y,0);}
  267. arraylist(A) ::= arraylist(X) COMMA expr(Y). {A = apndExpr(p,X,Y,0);}
  268. expr(A) ::= ID(X) LP exprlist(Y) RP. {A = funcExpr(p,&X,Y);}
  269. expr(A) ::= expr(X) AND(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  270. expr(A) ::= expr(X) OR(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  271. expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  272. expr(A) ::= expr(X) EQEQ|NE|EQ3|NE3(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  273. expr(A) ::= expr(X) BITAND(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  274. expr(A) ::= expr(X) BITXOR(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  275. expr(A) ::= expr(X) BITOR(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  276. expr(A) ::= expr(X) LSHIFT|RSHIFT|URSHIFT(OP) expr(Y).
  277. {A = biExpr(p,X,@OP,Y);}
  278. expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  279. expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  280. expr(A) ::= expr(X) IN|WITHIN(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  281. expr(A) ::= expr(X) ILIKEOP(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  282. expr(A) ::= expr(X) LIKEOP(OP) expr(Y). {A = biExpr(p,X,@OP,Y);}
  283. expr(A) ::= BANG(OP) expr(X). {A = biExpr(p,X,@OP,0);}
  284. expr(A) ::= BITNOT(OP) expr(X). {A = biExpr(p,X,@OP,0);}
  285. expr(A) ::= MINUS(OP) expr(X). [BITNOT] {A = biExpr(p,X,@OP,0);}
  286. expr(A) ::= PLUS(OP) expr(X). [BITNOT] {A = biExpr(p,X,@OP,0);}
  287. expr(A) ::= LP select(X) RP. {A = subqExpr(p,X);}
  288. expr(A) ::= LP expr(X) RP. {A = X;}
  289. expr(A) ::= expr(X) COLLATE ID|STRING. {A = X;}
  290. expr(A) ::= expr(X) QM expr(Y) COLON expr(Z). {A = triExpr(p,X,Y,Z);}
  291. %type exprlist {ExprList*}
  292. %type nexprlist {ExprList*}
  293. exprlist(A) ::= nexprlist(X). {A = X;}
  294. exprlist(A) ::= . {A = 0;}
  295. nexprlist(A) ::= expr(X). {A = apndExpr(p,0,X,0);}
  296. nexprlist(A) ::= nexprlist(X) COMMA expr(Y). {A = apndExpr(p,X,Y,0);}
  297. //////////////////////// The SELECT statement /////////////////////////////////
  298. //
  299. cmd(A) ::= select(X). {
  300. Command *pNew = xjd1PoolMalloc(p->pPool, sizeof(*pNew));
  301. if( pNew ){
  302. pNew->eCmdType = TK_SELECT;
  303. pNew->u.q.pQuery = X;
  304. }
  305. A = pNew;
  306. }
  307. %left UNION EXCEPT.
  308. %left INTERSECT.
  309. %type select {Query*}
  310. %type selectcore {Query*}
  311. %type compound {Query*}
  312. %type esel {Query*}
  313. %type x {Query*}
  314. %include {
  315. /* The value of a LIMIT ... OFFSET ... clause. */
  316. typedef struct LimitOffset {
  317. Expr *pLimit;
  318. Expr *pOffset;
  319. } LimitOffset;
  320. /* The value of a GROUP BY ... HAVING ... clause */
  321. typedef struct GroupByHaving {
  322. ExprList *pGroupBy;
  323. Expr *pHaving;
  324. } GroupByHaving;
  325. /* Construct a simple query object */
  326. static Query *simpleQuery(
  327. Parse *p,
  328. int isDistinct,
  329. Expr *pRes,
  330. const char *zAs,
  331. DataSrc *pFrom,
  332. Expr *pWhere,
  333. GroupByHaving *pGroupBy
  334. ){
  335. Query *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  336. if( pNew ){
  337. pNew->eQType = TK_SELECT;
  338. pNew->u.simple.isDistinct = isDistinct;
  339. pNew->u.simple.pRes = pRes;
  340. pNew->zAs = zAs;
  341. pNew->u.simple.pFrom = pFrom;
  342. pNew->u.simple.pWhere = pWhere;
  343. pNew->u.simple.pGroupBy = pGroupBy ? pGroupBy->pGroupBy : 0;
  344. pNew->u.simple.pHaving = pGroupBy ? pGroupBy->pHaving : 0;
  345. }
  346. return pNew;
  347. }
  348. /* Construct a compound query object */
  349. static Query *compoundQuery(
  350. Parse *p,
  351. Query *pLeft,
  352. int eOp,
  353. Query *pRight
  354. ){
  355. Query *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  356. if( pNew ){
  357. pNew->eQType = eOp;
  358. pNew->u.compound.pLeft = pLeft;
  359. pNew->u.compound.pRight = pRight;
  360. pNew->zAs = pLeft->zAs;
  361. }
  362. return pNew;
  363. }
  364. }
  365. select(A) ::= compound(Q) orderby_opt(O) limit_opt(L). {
  366. Q->pOrderBy = O;
  367. Q->pLimit = L.pLimit;
  368. Q->pOffset = L.pOffset;
  369. A = Q;
  370. }
  371. compound(A) ::= selectcore(X). {A = X;}
  372. compound(A) ::= esel(X) UNION(OP) esel(Y). {A=compoundQuery(p,X,@OP,Y);}
  373. compound(A) ::= esel(X) UNION ALL(OP) esel(Y). {A=compoundQuery(p,X,@OP,Y);}
  374. compound(A) ::= esel(X) EXCEPT(OP) esel(Y). {A=compoundQuery(p,X,@OP,Y);}
  375. compound(A) ::= esel(X) INTERSECT(OP) esel(Y). {A=compoundQuery(p,X,@OP,Y);}
  376. esel(A) ::= compound(X). {A = X;}
  377. esel(A) ::= expr(X). {
  378. /* TODO: Fix these error messages */
  379. if( p->errCode==XJD1_OK ){
  380. if( X->eClass!=XJD1_EXPR_Q ){
  381. xjd1ParseError(p, XJD1_SYNTAX,
  382. "syntax error near \"%.*s\"", p->sTok.n, p->sTok.z
  383. );
  384. }else{
  385. A = X->u.subq.p;
  386. if( A->pOrderBy || A->pLimit ){
  387. xjd1ParseError(p, XJD1_SYNTAX,
  388. "syntax error near \"%.*s\"", p->sTok.n, p->sTok.z
  389. );
  390. }
  391. }
  392. }
  393. }
  394. selectcore(A) ::= SELECT
  395. dist_opt(D) sel_result(S) from(F) where_opt(W) groupby_opt(G).
  396. {A = simpleQuery(p,D,S.pExpr,S.zAs,F,W,&G);}
  397. %type dist_opt {int}
  398. dist_opt(A) ::= . {A = 0;}
  399. dist_opt(A) ::= DISTINCT. {A = 1;}
  400. dist_opt(A) ::= ALL. {A = 0;}
  401. // The result set of an expression can be either an JSON expression
  402. // or nothing. If it is a JSON expression, it may be given an alias
  403. // using the "AS <id>" syntax.
  404. //
  405. %type sel_result {ExprItem}
  406. sel_result(A) ::= . {A.pExpr=0;A.zAs=0;}
  407. sel_result(A) ::= expr(X). {A.pExpr=X;A.zAs=0;}
  408. sel_result(A) ::= expr(X) AS ID(Y). {A.pExpr=X;A.zAs=tokenStr(p, &Y);}
  409. // A complete FROM clause.
  410. //
  411. %type from {DataSrc*}
  412. %type fromlist {DataSrc*}
  413. %type fromitem {DataSrc*}
  414. %include {
  415. /* Create a new data source that is a named table */
  416. static DataSrc *pathDataSrc(Parse *p, Expr *pPath, Token *pAs){
  417. DataSrc *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  418. if( pNew ){
  419. if( pPath ){
  420. if( pPath->eType==TK_ID ){
  421. pNew->eDSType = TK_ID;
  422. pNew->u.tab.zName = pPath->u.id.zId;
  423. }else{
  424. pNew->eDSType = TK_DOT;
  425. pNew->u.path.pPath = pPath;
  426. }
  427. pNew->zAs = tokenStr(p, pAs);
  428. }else{
  429. pNew->eDSType = TK_ID;
  430. pNew->u.tab.zName = tokenStr(p,pAs);
  431. }
  432. }
  433. return pNew;
  434. }
  435. /* Create a new data source that is a join */
  436. static DataSrc *joinDataSrc(Parse *p, DataSrc *pLeft, DataSrc *pRight){
  437. DataSrc *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  438. if( pNew ){
  439. pNew->eDSType = TK_COMMA;
  440. pNew->u.join.pLeft = pLeft;
  441. pNew->u.join.pRight = pRight;
  442. }
  443. return pNew;
  444. }
  445. /* Create a new subquery data source */
  446. static DataSrc *subqDataSrc(Parse *p, Query *pSubq, Token *pAs){
  447. DataSrc *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  448. if( pNew ){
  449. pNew->eDSType = TK_SELECT;
  450. pNew->u.subq.q = pSubq;
  451. pNew->zAs = tokenStr(p, pAs);
  452. }
  453. return pNew;
  454. }
  455. /* Create a new data source that is a FLATTEN or EACH operator */
  456. static DataSrc *flattenDataSrc(
  457. Parse *p,
  458. DataSrc *pLeft,
  459. Token *pOp,
  460. Expr *pPath,
  461. Expr *pAs
  462. ){
  463. DataSrc *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  464. if( pNew ){
  465. pNew->eDSType = TK_FLATTENOP;
  466. pNew->u.flatten.pNext = pLeft;
  467. pNew->u.flatten.cOpName = pOp->z[0];
  468. pNew->u.flatten.pExpr = pPath;
  469. pNew->u.flatten.pAs = (pAs ? pAs : pPath);
  470. }
  471. return pNew;
  472. }
  473. /* Create a new data source that represents an empty FROM clause.
  474. ** This is used for queries of the form "SELECT <expr>". It returns a
  475. ** single object with no properties.
  476. */
  477. static DataSrc *nullDataSrc(Parse *p){
  478. DataSrc *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  479. if( pNew ){
  480. pNew->eDSType = TK_NULL;
  481. }
  482. return pNew;
  483. }
  484. }
  485. from(A) ::= . {A = nullDataSrc(p);}
  486. from(A) ::= FROM fromlist(X). {A = X;}
  487. fromlist(A) ::= fromitem(X). {A = X;}
  488. fromlist(A) ::= fromlist(X) COMMA fromitem(Y). {A = joinDataSrc(p,X,Y);}
  489. fromitem(A) ::= LP select(X) RP AS ID(Y). {A = subqDataSrc(p,X,&Y);}
  490. fromitem(A) ::= ID(X). {A = pathDataSrc(p,0,&X);}
  491. fromitem(A) ::= path(X) AS ID(Y). {A = pathDataSrc(p,X,&Y);}
  492. fromitem(A) ::= fromitem(W) FLATTENOP(X) LP path(Y) eachalias(Z) RP. {
  493. A = flattenDataSrc(p,W,&X,Y,Z);
  494. }
  495. %type eachalias {Expr*}
  496. eachalias(A) ::= . {A=0;}
  497. eachalias(A) ::= AS ID|STRING(Y). {A=idExpr(p,&Y);}
  498. %type path {Expr*}
  499. path(A) ::= ID(Y). {A = idExpr(p, &Y); }
  500. path(A) ::= path(X) DOT ID(Y). {A = lvalueExpr(p, X, &Y); }
  501. path(A) ::= path(X) LB ID|STRING(Y) RB. {A = lvalueExpr(p, X, &Y); }
  502. %type groupby_opt {GroupByHaving}
  503. groupby_opt(A) ::= . {A.pGroupBy=0; A.pHaving=0;}
  504. groupby_opt(A) ::= GROUP BY exprlist(X). {A.pGroupBy=X; A.pHaving=0;}
  505. groupby_opt(A) ::= GROUP BY exprlist(X) HAVING expr(Y).
  506. {A.pGroupBy=X; A.pHaving=Y;}
  507. %type orderby_opt {ExprList*}
  508. %type sortlist {ExprList*}
  509. orderby_opt(A) ::= . {A = 0;}
  510. orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;}
  511. sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z).
  512. {A = apndExpr(p,X,Y,Z.n?&Z:0);}
  513. sortlist(A) ::= expr(Y) sortorder(Z). {A = apndExpr(p,0,Y,Z.n?&Z:0);}
  514. sortorder(A) ::= ASCENDING(X). {A = X;}
  515. sortorder(A) ::= DESCENDING(X). {A = X;}
  516. sortorder(A) ::= . {A.z=""; A.n=0;}
  517. %type limit_opt {LimitOffset}
  518. limit_opt(A) ::= . {A.pLimit=0; A.pOffset=0;}
  519. limit_opt(A) ::= LIMIT expr(X). {A.pLimit=X; A.pOffset=0;}
  520. limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). {A.pLimit=X; A.pOffset=Y;}
  521. %type where_opt {Expr*}
  522. where_opt(A) ::= . {A = 0;}
  523. where_opt(A) ::= WHERE expr(X). {A = X;}
  524. ///////////////////// TRANSACTIONS ////////////////////////////
  525. //
  526. cmd ::= BEGIN ID.
  527. cmd ::= ROLLBACK ID.
  528. cmd ::= COMMIT ID.
  529. ///////////////////// The CREATE COLLECTION statement ////////////////////////
  530. //
  531. cmd(A) ::= CREATE COLLECTION ifnotexists(B) tabname(N). {
  532. Command *pNew = xjd1PoolMalloc(p->pPool, sizeof(*pNew));
  533. if( pNew ){
  534. pNew->eCmdType = TK_CREATECOLLECTION;
  535. pNew->u.crtab.ifExists = B;
  536. pNew->u.crtab.zName = tokenStr(p, &N);
  537. }
  538. A = pNew;
  539. }
  540. %type ifnotexists {int}
  541. ifnotexists(A) ::= . {A = 0;}
  542. ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
  543. tabname(A) ::= ID(X). {A = X;}
  544. ////////////////////////// The DROP COLLECTION ///////////////////////////////
  545. //
  546. cmd(A) ::= DROP COLLECTION ifexists(B) tabname(N). {
  547. Command *pNew = xjd1PoolMalloc(p->pPool, sizeof(*pNew));
  548. if( pNew ){
  549. pNew->eCmdType = TK_DROPCOLLECTION;
  550. pNew->u.crtab.ifExists = B;
  551. pNew->u.crtab.zName = tokenStr(p, &N);
  552. }
  553. A = pNew;
  554. }
  555. %type ifexists {int}
  556. ifexists(A) ::= IF EXISTS. {A = 1;}
  557. ifexists(A) ::= . {A = 0;}
  558. /////////////////////////// The DELETE statement /////////////////////////////
  559. //
  560. cmd(A) ::= DELETE FROM tabname(N) where_opt(W). {
  561. Command *pNew = xjd1PoolMalloc(p->pPool, sizeof(*pNew));
  562. if( pNew ){
  563. pNew->eCmdType = TK_DELETE;
  564. pNew->u.del.zName = tokenStr(p, &N);
  565. pNew->u.del.pWhere = W;
  566. }
  567. A = pNew;
  568. }
  569. ////////////////////////// The UPDATE command ////////////////////////////////
  570. //
  571. cmd(A) ::= UPDATE tabname(N) SET setlist(L) where_opt(W) upsert_opt(U). {
  572. Command *pNew = xjd1PoolMalloc(p->pPool, sizeof(*pNew));
  573. if( pNew ){
  574. pNew->eCmdType = TK_UPDATE;
  575. pNew->u.update.zName = tokenStr(p, &N);
  576. pNew->u.update.pWhere = W;
  577. pNew->u.update.pChng = L;
  578. pNew->u.update.pUpsert = U;
  579. }
  580. A = pNew;
  581. }
  582. %type setlist {ExprList*}
  583. setlist(A) ::= setlist(X) COMMA lvalue(Y) EQ expr(Z). {
  584. A = apndExpr(p,X,Y,0);
  585. A = apndExpr(p,A,Z,0);
  586. }
  587. setlist(A) ::= lvalue(Y) EQ expr(Z). {
  588. A = apndExpr(p,0,Y,0);
  589. A = apndExpr(p,A,Z,0);
  590. }
  591. %type upsert_opt {Expr*}
  592. upsert_opt(A) ::= . {A = 0;}
  593. upsert_opt(A) ::= ELSE INSERT expr(X). {A = X;}
  594. ////////////////////////// The INSERT command /////////////////////////////////
  595. //
  596. cmd(A) ::= async INSERT INTO tabname(N) VALUE expr(V). {
  597. Command *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  598. if( pNew ){
  599. pNew->eCmdType = TK_INSERT;
  600. pNew->u.ins.zName = tokenStr(p, &N);
  601. pNew->u.ins.pValue = V;
  602. }
  603. A = pNew;
  604. }
  605. cmd(A) ::= async INSERT INTO tabname(N) select(Q). {
  606. Command *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  607. if( pNew ){
  608. pNew->eCmdType = TK_INSERT;
  609. pNew->u.ins.zName = tokenStr(p, &N);
  610. pNew->u.ins.pQuery = Q;
  611. }
  612. A = pNew;
  613. }
  614. async ::= .
  615. async ::= ASYNC.
  616. async ::= SYNC.
  617. ////////////////////////// The PRAGMA command /////////////////////////////////
  618. //
  619. %include {
  620. static Command *makePrag(Parse *p, Token *pName, Expr *pValue){
  621. Command *pNew = xjd1PoolMallocZero(p->pPool, sizeof(*pNew));
  622. if( pNew ){
  623. pNew->eCmdType = TK_PRAGMA;
  624. pNew->u.prag.zName = tokenStr(p, pName);
  625. pNew->u.prag.pValue = pValue;
  626. }
  627. return pNew;
  628. }
  629. }
  630. cmd(A) ::= PRAGMA ID(N). {A = makePrag(p,&N,0);}
  631. cmd(A) ::= PRAGMA ID(N) EQ expr(V). {A = makePrag(p,&N,V);}
  632. cmd(A) ::= PRAGMA ID(N) LP expr(V) RP. {A = makePrag(p,&N,V);}