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

数据库系统

开发平台:

Unix_Linux

  1. case 644:
  2. #line 3558 "gram.y"
  3. {
  4. SubLink *n = makeNode(SubLink);
  5. n->lefthand = yyvsp[-6].list;
  6. n->oper = lcons(yyvsp[-4].str, NIL);
  7. if (strcmp(yyvsp[-4].str,"<>") == 0)
  8. n->useor = true;
  9. else
  10. n->useor = false;
  11. n->subLinkType = yyvsp[-3].ival;
  12. n->subselect = yyvsp[-1].node;
  13. yyval.node = (Node *)n;
  14. ;
  15.     break;}
  16. case 645:
  17. #line 3571 "gram.y"
  18. {
  19. SubLink *n = makeNode(SubLink);
  20. n->lefthand = yyvsp[-5].list;
  21. n->oper = lcons(yyvsp[-3].str, NIL);
  22. if (strcmp(yyvsp[-3].str,"<>") == 0)
  23. n->useor = true;
  24. else
  25. n->useor = false;
  26. n->subLinkType = EXPR_SUBLINK;
  27. n->subselect = yyvsp[-1].node;
  28. yyval.node = (Node *)n;
  29. ;
  30.     break;}
  31. case 646:
  32. #line 3584 "gram.y"
  33. {
  34. yyval.node = makeRowExpr(yyvsp[-3].str, yyvsp[-5].list, yyvsp[-1].list);
  35. ;
  36.     break;}
  37. case 647:
  38. #line 3590 "gram.y"
  39. {
  40. yyval.list = lappend(yyvsp[-2].list, yyvsp[0].node);
  41. ;
  42.     break;}
  43. case 648:
  44. #line 3596 "gram.y"
  45. {
  46. yyval.list = lappend(yyvsp[-2].list, yyvsp[0].node);
  47. ;
  48.     break;}
  49. case 649:
  50. #line 3600 "gram.y"
  51. {
  52. yyval.list = lcons(yyvsp[0].node, NIL);
  53. ;
  54.     break;}
  55. case 650:
  56. #line 3605 "gram.y"
  57. { yyval.str = yyvsp[0].str; ;
  58.     break;}
  59. case 651:
  60. #line 3606 "gram.y"
  61. { yyval.str = "<"; ;
  62.     break;}
  63. case 652:
  64. #line 3607 "gram.y"
  65. { yyval.str = "="; ;
  66.     break;}
  67. case 653:
  68. #line 3608 "gram.y"
  69. { yyval.str = ">"; ;
  70.     break;}
  71. case 654:
  72. #line 3609 "gram.y"
  73. { yyval.str = "+"; ;
  74.     break;}
  75. case 655:
  76. #line 3610 "gram.y"
  77. { yyval.str = "-"; ;
  78.     break;}
  79. case 656:
  80. #line 3611 "gram.y"
  81. { yyval.str = "*"; ;
  82.     break;}
  83. case 657:
  84. #line 3612 "gram.y"
  85. { yyval.str = "/"; ;
  86.     break;}
  87. case 658:
  88. #line 3613 "gram.y"
  89. { yyval.str = "%"; ;
  90.     break;}
  91. case 659:
  92. #line 3616 "gram.y"
  93. { yyval.ival = ANY_SUBLINK; ;
  94.     break;}
  95. case 660:
  96. #line 3617 "gram.y"
  97. { yyval.ival = ALL_SUBLINK; ;
  98.     break;}
  99. case 661:
  100. #line 3629 "gram.y"
  101. {
  102. yyvsp[-1].attr->indirection = yyvsp[0].list;
  103. yyval.node = (Node *)yyvsp[-1].attr;
  104. ;
  105.     break;}
  106. case 662:
  107. #line 3634 "gram.y"
  108. { yyval.node = yyvsp[0].node;  ;
  109.     break;}
  110. case 663:
  111. #line 3636 "gram.y"
  112. { yyval.node = yyvsp[0].node;  ;
  113.     break;}
  114. case 664:
  115. #line 3638 "gram.y"
  116. {
  117. /* could be a column name or a relation_name */
  118. Ident *n = makeNode(Ident);
  119. n->name = yyvsp[0].str;
  120. n->indirection = NULL;
  121. yyval.node = (Node *)n;
  122. ;
  123.     break;}
  124. case 665:
  125. #line 3646 "gram.y"
  126. { yyval.node = doNegate(yyvsp[0].node); ;
  127.     break;}
  128. case 666:
  129. #line 3648 "gram.y"
  130. { yyval.node = makeA_Expr(OP, "%", NULL, yyvsp[0].node); ;
  131.     break;}
  132. case 667:
  133. #line 3650 "gram.y"
  134. { yyval.node = makeA_Expr(OP, "^", NULL, yyvsp[0].node); ;
  135.     break;}
  136. case 668:
  137. #line 3652 "gram.y"
  138. { yyval.node = makeA_Expr(OP, "%", yyvsp[-1].node, NULL); ;
  139.     break;}
  140. case 669:
  141. #line 3654 "gram.y"
  142. { yyval.node = makeA_Expr(OP, "^", yyvsp[-1].node, NULL); ;
  143.     break;}
  144. case 670:
  145. #line 3656 "gram.y"
  146. { yyval.node = makeA_Expr(OP, "+", yyvsp[-2].node, yyvsp[0].node); ;
  147.     break;}
  148. case 671:
  149. #line 3658 "gram.y"
  150. { yyval.node = makeA_Expr(OP, "-", yyvsp[-2].node, yyvsp[0].node); ;
  151.     break;}
  152. case 672:
  153. #line 3660 "gram.y"
  154. { yyval.node = makeA_Expr(OP, "/", yyvsp[-2].node, yyvsp[0].node); ;
  155.     break;}
  156. case 673:
  157. #line 3662 "gram.y"
  158. { yyval.node = makeA_Expr(OP, "%", yyvsp[-2].node, yyvsp[0].node); ;
  159.     break;}
  160. case 674:
  161. #line 3664 "gram.y"
  162. { yyval.node = makeA_Expr(OP, "*", yyvsp[-2].node, yyvsp[0].node); ;
  163.     break;}
  164. case 675:
  165. #line 3666 "gram.y"
  166. { yyval.node = makeA_Expr(OP, "^", yyvsp[-2].node, yyvsp[0].node); ;
  167.     break;}
  168. case 676:
  169. #line 3668 "gram.y"
  170. { yyval.node = makeA_Expr(OP, "<", yyvsp[-2].node, yyvsp[0].node); ;
  171.     break;}
  172. case 677:
  173. #line 3670 "gram.y"
  174. { yyval.node = makeA_Expr(OP, ">", yyvsp[-2].node, yyvsp[0].node); ;
  175.     break;}
  176. case 678:
  177. #line 3673 "gram.y"
  178. { yyval.node = makeA_Expr(ISNULL, NULL, yyvsp[-2].node, NULL); ;
  179.     break;}
  180. case 679:
  181. #line 3676 "gram.y"
  182. { yyval.node = makeA_Expr(ISNULL, NULL, yyvsp[0].node, NULL); ;
  183.     break;}
  184. case 680:
  185. #line 3679 "gram.y"
  186. { yyval.node = makeA_Expr(OP, "=", yyvsp[-2].node, yyvsp[0].node); ;
  187.     break;}
  188. case 681:
  189. #line 3681 "gram.y"
  190. { yyval.node = makeA_Expr(OP, ":", NULL, yyvsp[0].node); ;
  191.     break;}
  192. case 682:
  193. #line 3683 "gram.y"
  194. { yyval.node = makeA_Expr(OP, ";", NULL, yyvsp[0].node); ;
  195.     break;}
  196. case 683:
  197. #line 3685 "gram.y"
  198. { yyval.node = makeA_Expr(OP, "|", NULL, yyvsp[0].node); ;
  199.     break;}
  200. case 684:
  201. #line 3687 "gram.y"
  202. {
  203. yyval.node = (Node *)yyvsp[-2].node;
  204. /* AexprConst can be either A_Const or ParamNo */
  205. if (nodeTag(yyvsp[-2].node) == T_A_Const) {
  206. ((A_Const *)yyvsp[-2].node)->typename = yyvsp[0].typnam;
  207. } else if (nodeTag(yyvsp[-2].node) == T_Param) {
  208. ((ParamNo *)yyvsp[-2].node)->typename = yyvsp[0].typnam;
  209. /* otherwise, try to transform to a function call */
  210. } else {
  211. FuncCall *n = makeNode(FuncCall);
  212. n->funcname = yyvsp[0].typnam->name;
  213. n->args = lcons(yyvsp[-2].node,NIL);
  214. yyval.node = (Node *)n;
  215. }
  216. ;
  217.     break;}
  218. case 685:
  219. #line 3703 "gram.y"
  220. {
  221. yyval.node = (Node *)yyvsp[-3].node;
  222. /* AexprConst can be either A_Const or ParamNo */
  223. if (nodeTag(yyvsp[-3].node) == T_A_Const) {
  224. ((A_Const *)yyvsp[-3].node)->typename = yyvsp[-1].typnam;
  225. } else if (nodeTag(yyvsp[-1].typnam) == T_Param) {
  226. ((ParamNo *)yyvsp[-3].node)->typename = yyvsp[-1].typnam;
  227. /* otherwise, try to transform to a function call */
  228. } else {
  229. FuncCall *n = makeNode(FuncCall);
  230. n->funcname = yyvsp[-1].typnam->name;
  231. n->args = lcons(yyvsp[-3].node,NIL);
  232. yyval.node = (Node *)n;
  233. }
  234. ;
  235.     break;}
  236. case 686:
  237. #line 3719 "gram.y"
  238. { yyval.node = yyvsp[-1].node; ;
  239.     break;}
  240. case 687:
  241. #line 3721 "gram.y"
  242. { yyval.node = makeIndexable(yyvsp[-1].str,yyvsp[-2].node,yyvsp[0].node); ;
  243.     break;}
  244. case 688:
  245. #line 3723 "gram.y"
  246. { yyval.node = makeIndexable("~~", yyvsp[-2].node, yyvsp[0].node); ;
  247.     break;}
  248. case 689:
  249. #line 3725 "gram.y"
  250. { yyval.node = makeA_Expr(OP, "!~~", yyvsp[-3].node, yyvsp[0].node); ;
  251.     break;}
  252. case 690:
  253. #line 3727 "gram.y"
  254. { yyval.node = makeA_Expr(OP, yyvsp[-1].str, NULL, yyvsp[0].node); ;
  255.     break;}
  256. case 691:
  257. #line 3729 "gram.y"
  258. { yyval.node = makeA_Expr(OP, yyvsp[0].str, yyvsp[-1].node, NULL); ;
  259.     break;}
  260. case 692:
  261. #line 3731 "gram.y"
  262. {
  263. /* cheap hack for aggregate (eg. count) */
  264. FuncCall *n = makeNode(FuncCall);
  265. A_Const *star = makeNode(A_Const);
  266. star->val.type = T_String;
  267. star->val.val.str = "";
  268. n->funcname = yyvsp[-3].str;
  269. n->args = lcons(star, NIL);
  270. yyval.node = (Node *)n;
  271. ;
  272.     break;}
  273. case 693:
  274. #line 3743 "gram.y"
  275. {
  276. FuncCall *n = makeNode(FuncCall);
  277. n->funcname = yyvsp[-2].str;
  278. n->args = NIL;
  279. yyval.node = (Node *)n;
  280. ;
  281.     break;}
  282. case 694:
  283. #line 3750 "gram.y"
  284. {
  285. FuncCall *n = makeNode(FuncCall);
  286. n->funcname = yyvsp[-3].str;
  287. n->args = yyvsp[-1].list;
  288. yyval.node = (Node *)n;
  289. ;
  290.     break;}
  291. case 695:
  292. #line 3757 "gram.y"
  293. {
  294. A_Const *n = makeNode(A_Const);
  295. TypeName *t = makeNode(TypeName);
  296. n->val.type = T_String;
  297. n->val.val.str = "now";
  298. n->typename = t;
  299. t->name = xlateSqlType("date");
  300. t->setof = FALSE;
  301. t->typmod = -1;
  302.  
  303. yyval.node = (Node *)n;
  304. ;
  305.     break;}
  306. case 696:
  307. #line 3772 "gram.y"
  308. {
  309. A_Const *n = makeNode(A_Const);
  310. TypeName *t = makeNode(TypeName);
  311. n->val.type = T_String;
  312. n->val.val.str = "now";
  313. n->typename = t;
  314. t->name = xlateSqlType("time");
  315. t->setof = FALSE;
  316. t->typmod = -1;
  317. yyval.node = (Node *)n;
  318. ;
  319.     break;}
  320. case 697:
  321. #line 3787 "gram.y"
  322. {
  323. FuncCall *n = makeNode(FuncCall);
  324. A_Const *s = makeNode(A_Const);
  325. TypeName *t = makeNode(TypeName);
  326. n->funcname = xlateSqlType("time");
  327. n->args = lcons(s, NIL);
  328. s->val.type = T_String;
  329. s->val.val.str = "now";
  330. s->typename = t;
  331. t->name = xlateSqlType("time");
  332. t->setof = FALSE;
  333. t->typmod = -1;
  334. if (yyvsp[-1].ival != 0)
  335. elog(NOTICE,"CURRENT_TIME(%d) precision not implemented; zero used instead",yyvsp[-1].ival);
  336. yyval.node = (Node *)n;
  337. ;
  338.     break;}
  339. case 698:
  340. #line 3809 "gram.y"
  341. {
  342. A_Const *n = makeNode(A_Const);
  343. TypeName *t = makeNode(TypeName);
  344. n->val.type = T_String;
  345. n->val.val.str = "now";
  346. n->typename = t;
  347. t->name = xlateSqlType("timestamp");
  348. t->setof = FALSE;
  349. t->typmod = -1;
  350. yyval.node = (Node *)n;
  351. ;
  352.     break;}
  353. case 699:
  354. #line 3824 "gram.y"
  355. {
  356. FuncCall *n = makeNode(FuncCall);
  357. A_Const *s = makeNode(A_Const);
  358. TypeName *t = makeNode(TypeName);
  359. n->funcname = xlateSqlType("timestamp");
  360. n->args = lcons(s, NIL);
  361. s->val.type = T_String;
  362. s->val.val.str = "now";
  363. s->typename = t;
  364. t->name = xlateSqlType("timestamp");
  365. t->setof = FALSE;
  366. t->typmod = -1;
  367. if (yyvsp[-1].ival != 0)
  368. elog(NOTICE,"CURRENT_TIMESTAMP(%d) precision not implemented; zero used instead",yyvsp[-1].ival);
  369. yyval.node = (Node *)n;
  370. ;
  371.     break;}
  372. case 700:
  373. #line 3846 "gram.y"
  374. {
  375. FuncCall *n = makeNode(FuncCall);
  376. n->funcname = "getpgusername";
  377. n->args = NIL;
  378. yyval.node = (Node *)n;
  379. ;
  380.     break;}
  381. case 701:
  382. #line 3853 "gram.y"
  383. {
  384. FuncCall *n = makeNode(FuncCall);
  385. n->funcname = "getpgusername";
  386. n->args = NIL;
  387. yyval.node = (Node *)n;
  388. ;
  389.     break;}
  390. case 702:
  391. #line 3860 "gram.y"
  392. {
  393. SubLink *n = makeNode(SubLink);
  394. n->lefthand = NIL;
  395. n->useor = false;
  396. n->oper = NIL;
  397. n->subLinkType = EXISTS_SUBLINK;
  398. n->subselect = yyvsp[-1].node;
  399. yyval.node = (Node *)n;
  400. ;
  401.     break;}
  402. case 703:
  403. #line 3870 "gram.y"
  404. {
  405. FuncCall *n = makeNode(FuncCall);
  406. n->funcname = "date_part";
  407. n->args = yyvsp[-1].list;
  408. yyval.node = (Node *)n;
  409. ;
  410.     break;}
  411. case 704:
  412. #line 3877 "gram.y"
  413. {
  414. FuncCall *n = makeNode(FuncCall);
  415. n->funcname = "strpos";
  416. n->args = yyvsp[-1].list;
  417. yyval.node = (Node *)n;
  418. ;
  419.     break;}
  420. case 705:
  421. #line 3884 "gram.y"
  422. {
  423. FuncCall *n = makeNode(FuncCall);
  424. n->funcname = "substr";
  425. n->args = yyvsp[-1].list;
  426. yyval.node = (Node *)n;
  427. ;
  428.     break;}
  429. case 706:
  430. #line 3892 "gram.y"
  431. {
  432. FuncCall *n = makeNode(FuncCall);
  433. n->funcname = "btrim";
  434. n->args = yyvsp[-1].list;
  435. yyval.node = (Node *)n;
  436. ;
  437.     break;}
  438. case 707:
  439. #line 3899 "gram.y"
  440. {
  441. FuncCall *n = makeNode(FuncCall);
  442. n->funcname = "ltrim";
  443. n->args = yyvsp[-1].list;
  444. yyval.node = (Node *)n;
  445. ;
  446.     break;}
  447. case 708:
  448. #line 3906 "gram.y"
  449. {
  450. FuncCall *n = makeNode(FuncCall);
  451. n->funcname = "rtrim";
  452. n->args = yyvsp[-1].list;
  453. yyval.node = (Node *)n;
  454. ;
  455.     break;}
  456. case 709:
  457. #line 3913 "gram.y"
  458. {
  459. FuncCall *n = makeNode(FuncCall);
  460. n->funcname = "btrim";
  461. n->args = yyvsp[-1].list;
  462. yyval.node = (Node *)n;
  463. ;
  464.     break;}
  465. case 710:
  466. #line 3920 "gram.y"
  467. { yyval.node = makeA_Expr(ISNULL, NULL, yyvsp[-1].node, NULL); ;
  468.     break;}
  469. case 711:
  470. #line 3922 "gram.y"
  471. { yyval.node = makeA_Expr(ISNULL, NULL, yyvsp[-2].node, NULL); ;
  472.     break;}
  473. case 712:
  474. #line 3924 "gram.y"
  475. { yyval.node = makeA_Expr(NOTNULL, NULL, yyvsp[-1].node, NULL); ;
  476.     break;}
  477. case 713:
  478. #line 3926 "gram.y"
  479. { yyval.node = makeA_Expr(NOTNULL, NULL, yyvsp[-3].node, NULL); ;
  480.     break;}
  481. case 714:
  482. #line 3933 "gram.y"
  483. {
  484. A_Const *n = makeNode(A_Const);
  485. n->val.type = T_String;
  486. n->val.val.str = "t";
  487. n->typename = makeNode(TypeName);
  488. n->typename->name = xlateSqlType("bool");
  489. n->typename->typmod = -1;
  490. yyval.node = makeA_Expr(OP, "=", yyvsp[-2].node,(Node *)n);
  491. ;
  492.     break;}
  493. case 715:
  494. #line 3943 "gram.y"
  495. {
  496. A_Const *n = makeNode(A_Const);
  497. n->val.type = T_String;
  498. n->val.val.str = "t";
  499. n->typename = makeNode(TypeName);
  500. n->typename->name = xlateSqlType("bool");
  501. n->typename->typmod = -1;
  502. yyval.node = makeA_Expr(OP, "=", yyvsp[-3].node,(Node *)n);
  503. ;
  504.     break;}
  505. case 716:
  506. #line 3953 "gram.y"
  507. {
  508. A_Const *n = makeNode(A_Const);
  509. n->val.type = T_String;
  510. n->val.val.str = "f";
  511. n->typename = makeNode(TypeName);
  512. n->typename->name = xlateSqlType("bool");
  513. n->typename->typmod = -1;
  514. yyval.node = makeA_Expr(OP, "=", yyvsp[-2].node,(Node *)n);
  515. ;
  516.     break;}
  517. case 717:
  518. #line 3963 "gram.y"
  519. {
  520. A_Const *n = makeNode(A_Const);
  521. n->val.type = T_String;
  522. n->val.val.str = "f";
  523. n->typename = makeNode(TypeName);
  524. n->typename->name = xlateSqlType("bool");
  525. n->typename->typmod = -1;
  526. yyval.node = makeA_Expr(OP, "=", yyvsp[-3].node,(Node *)n);
  527. ;
  528.     break;}
  529. case 718:
  530. #line 3973 "gram.y"
  531. {
  532. yyval.node = makeA_Expr(AND, NULL,
  533. makeA_Expr(OP, ">=", yyvsp[-4].node, yyvsp[-2].node),
  534. makeA_Expr(OP, "<=", yyvsp[-4].node, yyvsp[0].node));
  535. ;
  536.     break;}
  537. case 719:
  538. #line 3979 "gram.y"
  539. {
  540. yyval.node = makeA_Expr(OR, NULL,
  541. makeA_Expr(OP, "<", yyvsp[-5].node, yyvsp[-2].node),
  542. makeA_Expr(OP, ">", yyvsp[-5].node, yyvsp[0].node));
  543. ;
  544.     break;}
  545. case 720:
  546. #line 3984 "gram.y"
  547. { saved_In_Expr = lcons(yyvsp[-1].node,saved_In_Expr); ;
  548.     break;}
  549. case 721:
  550. #line 3985 "gram.y"
  551. {
  552. saved_In_Expr = lnext(saved_In_Expr);
  553. if (nodeTag(yyvsp[-1].node) == T_SubLink)
  554. {
  555. SubLink *n = (SubLink *)yyvsp[-1].node;
  556. n->lefthand = lcons(yyvsp[-5].node, NIL);
  557. n->oper = lcons("=",NIL);
  558. n->useor = false;
  559. n->subLinkType = ANY_SUBLINK;
  560. yyval.node = (Node *)n;
  561. }
  562. else yyval.node = yyvsp[-1].node;
  563. ;
  564.     break;}
  565. case 722:
  566. #line 3998 "gram.y"
  567. { saved_In_Expr = lcons(yyvsp[-2].node,saved_In_Expr); ;
  568.     break;}
  569. case 723:
  570. #line 3999 "gram.y"
  571. {
  572. saved_In_Expr = lnext(saved_In_Expr);
  573. if (nodeTag(yyvsp[-1].node) == T_SubLink)
  574. {
  575. SubLink *n = (SubLink *)yyvsp[-1].node;
  576. n->lefthand = lcons(yyvsp[-6].node, NIL);
  577. n->oper = lcons("<>",NIL);
  578. n->useor = false;
  579. n->subLinkType = ALL_SUBLINK;
  580. yyval.node = (Node *)n;
  581. }
  582. else yyval.node = yyvsp[-1].node;
  583. ;
  584.     break;}
  585. case 724:
  586. #line 4013 "gram.y"
  587. {
  588. SubLink *n = makeNode(SubLink);
  589. n->lefthand = lcons(yyvsp[-4].node, NULL);
  590. n->oper = lcons(yyvsp[-3].str,NIL);
  591. n->useor = false;
  592. n->subLinkType = EXPR_SUBLINK;
  593. n->subselect = yyvsp[-1].node;
  594. yyval.node = (Node *)n;
  595. ;
  596.     break;}
  597. case 725:
  598. #line 4023 "gram.y"
  599. {
  600. SubLink *n = makeNode(SubLink);
  601. n->lefthand = lcons(yyvsp[-4].node, NULL);
  602. n->oper = lcons("+",NIL);
  603. n->useor = false;
  604. n->subLinkType = EXPR_SUBLINK;
  605. n->subselect = yyvsp[-1].node;
  606. yyval.node = (Node *)n;
  607. ;
  608.     break;}
  609. case 726:
  610. #line 4033 "gram.y"
  611. {
  612. SubLink *n = makeNode(SubLink);
  613. n->lefthand = lcons(yyvsp[-4].node, NULL);
  614. n->oper = lcons("-",NIL);
  615. n->useor = false;
  616. n->subLinkType = EXPR_SUBLINK;
  617. n->subselect = yyvsp[-1].node;
  618. yyval.node = (Node *)n;
  619. ;
  620.     break;}
  621. case 727:
  622. #line 4043 "gram.y"
  623. {
  624. SubLink *n = makeNode(SubLink);
  625. n->lefthand = lcons(yyvsp[-4].node, NULL);
  626. n->oper = lcons("/",NIL);
  627. n->useor = false;
  628. n->subLinkType = EXPR_SUBLINK;
  629. n->subselect = yyvsp[-1].node;
  630. yyval.node = (Node *)n;
  631. ;
  632.     break;}
  633. case 728:
  634. #line 4053 "gram.y"
  635. {
  636. SubLink *n = makeNode(SubLink);
  637. n->lefthand = lcons(yyvsp[-4].node, NULL);
  638. n->oper = lcons("%",NIL);
  639. n->useor = false;
  640. n->subLinkType = EXPR_SUBLINK;
  641. n->subselect = yyvsp[-1].node;
  642. yyval.node = (Node *)n;
  643. ;
  644.     break;}
  645. case 729:
  646. #line 4063 "gram.y"
  647. {
  648. SubLink *n = makeNode(SubLink);
  649. n->lefthand = lcons(yyvsp[-4].node, NULL);
  650. n->oper = lcons("*",NIL);
  651. n->useor = false;
  652. n->subLinkType = EXPR_SUBLINK;
  653. n->subselect = yyvsp[-1].node;
  654. yyval.node = (Node *)n;
  655. ;
  656.     break;}
  657. case 730:
  658. #line 4073 "gram.y"
  659. {
  660. SubLink *n = makeNode(SubLink);
  661. n->lefthand = lcons(yyvsp[-4].node, NULL);
  662. n->oper = lcons("<",NIL);
  663. n->useor = false;
  664. n->subLinkType = EXPR_SUBLINK;
  665. n->subselect = yyvsp[-1].node;
  666. yyval.node = (Node *)n;
  667. ;
  668.     break;}
  669. case 731:
  670. #line 4083 "gram.y"
  671. {
  672. SubLink *n = makeNode(SubLink);
  673. n->lefthand = lcons(yyvsp[-4].node, NULL);
  674. n->oper = lcons(">",NIL);
  675. n->useor = false;
  676. n->subLinkType = EXPR_SUBLINK;
  677. n->subselect = yyvsp[-1].node;
  678. yyval.node = (Node *)n;
  679. ;
  680.     break;}
  681. case 732:
  682. #line 4093 "gram.y"
  683. {
  684. SubLink *n = makeNode(SubLink);
  685. n->lefthand = lcons(yyvsp[-4].node, NULL);
  686. n->oper = lcons("=",NIL);
  687. n->useor = false;
  688. n->subLinkType = EXPR_SUBLINK;
  689. n->subselect = yyvsp[-1].node;
  690. yyval.node = (Node *)n;
  691. ;
  692.     break;}
  693. case 733:
  694. #line 4103 "gram.y"
  695. {
  696. SubLink *n = makeNode(SubLink);
  697. n->lefthand = lcons(yyvsp[-5].node,NIL);
  698. n->oper = lcons(yyvsp[-4].str,NIL);
  699. n->useor = false;
  700. n->subLinkType = ANY_SUBLINK;
  701. n->subselect = yyvsp[-1].node;
  702. yyval.node = (Node *)n;
  703. ;
  704.     break;}
  705. case 734:
  706. #line 4113 "gram.y"
  707. {
  708. SubLink *n = makeNode(SubLink);
  709. n->lefthand = lcons(yyvsp[-5].node,NIL);
  710. n->oper = lcons("+",NIL);
  711. n->useor = false;
  712. n->subLinkType = ANY_SUBLINK;
  713. n->subselect = yyvsp[-1].node;
  714. yyval.node = (Node *)n;
  715. ;
  716.     break;}
  717. case 735:
  718. #line 4123 "gram.y"
  719. {
  720. SubLink *n = makeNode(SubLink);
  721. n->lefthand = lcons(yyvsp[-5].node,NIL);
  722. n->oper = lcons("-",NIL);
  723. n->useor = false;
  724. n->subLinkType = ANY_SUBLINK;
  725. n->subselect = yyvsp[-1].node;
  726. yyval.node = (Node *)n;
  727. ;
  728.     break;}
  729. case 736:
  730. #line 4133 "gram.y"
  731. {
  732. SubLink *n = makeNode(SubLink);
  733. n->lefthand = lcons(yyvsp[-5].node,NIL);
  734. n->oper = lcons("/",NIL);
  735. n->useor = false;
  736. n->subLinkType = ANY_SUBLINK;
  737. n->subselect = yyvsp[-1].node;
  738. yyval.node = (Node *)n;
  739. ;
  740.     break;}
  741. case 737:
  742. #line 4143 "gram.y"
  743. {
  744. SubLink *n = makeNode(SubLink);
  745. n->lefthand = lcons(yyvsp[-5].node,NIL);
  746. n->oper = lcons("%",NIL);
  747. n->useor = false;
  748. n->subLinkType = ANY_SUBLINK;
  749. n->subselect = yyvsp[-1].node;
  750. yyval.node = (Node *)n;
  751. ;
  752.     break;}
  753. case 738:
  754. #line 4153 "gram.y"
  755. {
  756. SubLink *n = makeNode(SubLink);
  757. n->lefthand = lcons(yyvsp[-5].node,NIL);
  758. n->oper = lcons("*",NIL);
  759. n->useor = false;
  760. n->subLinkType = ANY_SUBLINK;
  761. n->subselect = yyvsp[-1].node;
  762. yyval.node = (Node *)n;
  763. ;
  764.     break;}
  765. case 739:
  766. #line 4163 "gram.y"
  767. {
  768. SubLink *n = makeNode(SubLink);
  769. n->lefthand = lcons(yyvsp[-5].node,NIL);
  770. n->oper = lcons("<",NIL);
  771. n->useor = false;
  772. n->subLinkType = ANY_SUBLINK;
  773. n->subselect = yyvsp[-1].node;
  774. yyval.node = (Node *)n;
  775. ;
  776.     break;}
  777. case 740:
  778. #line 4173 "gram.y"
  779. {
  780. SubLink *n = makeNode(SubLink);
  781. n->lefthand = lcons(yyvsp[-5].node,NIL);
  782. n->oper = lcons(">",NIL);
  783. n->useor = false;
  784. n->subLinkType = ANY_SUBLINK;
  785. n->subselect = yyvsp[-1].node;
  786. yyval.node = (Node *)n;
  787. ;
  788.     break;}
  789. case 741:
  790. #line 4183 "gram.y"
  791. {
  792. SubLink *n = makeNode(SubLink);
  793. n->lefthand = lcons(yyvsp[-5].node,NIL);
  794. n->oper = lcons("=",NIL);
  795. n->useor = false;
  796. n->subLinkType = ANY_SUBLINK;
  797. n->subselect = yyvsp[-1].node;
  798. yyval.node = (Node *)n;
  799. ;
  800.     break;}
  801. case 742:
  802. #line 4193 "gram.y"
  803. {
  804. SubLink *n = makeNode(SubLink);
  805. n->lefthand = lcons(yyvsp[-5].node, NULL);
  806. n->oper = lcons(yyvsp[-4].str,NIL);
  807. n->useor = false;
  808. n->subLinkType = ALL_SUBLINK;
  809. n->subselect = yyvsp[-1].node;
  810. yyval.node = (Node *)n;
  811. ;
  812.     break;}
  813. case 743:
  814. #line 4203 "gram.y"
  815. {
  816. SubLink *n = makeNode(SubLink);
  817. n->lefthand = lcons(yyvsp[-5].node, NULL);
  818. n->oper = lcons("+",NIL);
  819. n->useor = false;
  820. n->subLinkType = ALL_SUBLINK;
  821. n->subselect = yyvsp[-1].node;
  822. yyval.node = (Node *)n;
  823. ;
  824.     break;}
  825. case 744:
  826. #line 4213 "gram.y"
  827. {
  828. SubLink *n = makeNode(SubLink);
  829. n->lefthand = lcons(yyvsp[-5].node, NULL);
  830. n->oper = lcons("-",NIL);
  831. n->useor = false;
  832. n->subLinkType = ALL_SUBLINK;
  833. n->subselect = yyvsp[-1].node;
  834. yyval.node = (Node *)n;
  835. ;
  836.     break;}
  837. case 745:
  838. #line 4223 "gram.y"
  839. {
  840. SubLink *n = makeNode(SubLink);
  841. n->lefthand = lcons(yyvsp[-5].node, NULL);
  842. n->oper = lcons("/",NIL);
  843. n->useor = false;
  844. n->subLinkType = ALL_SUBLINK;
  845. n->subselect = yyvsp[-1].node;
  846. yyval.node = (Node *)n;
  847. ;
  848.     break;}
  849. case 746:
  850. #line 4233 "gram.y"
  851. {
  852. SubLink *n = makeNode(SubLink);
  853. n->lefthand = lcons(yyvsp[-5].node, NULL);
  854. n->oper = lcons("%",NIL);
  855. n->useor = false;
  856. n->subLinkType = ALL_SUBLINK;
  857. n->subselect = yyvsp[-1].node;
  858. yyval.node = (Node *)n;
  859. ;
  860.     break;}
  861. case 747:
  862. #line 4243 "gram.y"
  863. {
  864. SubLink *n = makeNode(SubLink);
  865. n->lefthand = lcons(yyvsp[-5].node, NULL);
  866. n->oper = lcons("*",NIL);
  867. n->useor = false;
  868. n->subLinkType = ALL_SUBLINK;
  869. n->subselect = yyvsp[-1].node;
  870. yyval.node = (Node *)n;
  871. ;
  872.     break;}
  873. case 748:
  874. #line 4253 "gram.y"
  875. {
  876. SubLink *n = makeNode(SubLink);
  877. n->lefthand = lcons(yyvsp[-5].node, NULL);
  878. n->oper = lcons("<",NIL);
  879. n->useor = false;
  880. n->subLinkType = ALL_SUBLINK;
  881. n->subselect = yyvsp[-1].node;
  882. yyval.node = (Node *)n;
  883. ;
  884.     break;}
  885. case 749:
  886. #line 4263 "gram.y"
  887. {
  888. SubLink *n = makeNode(SubLink);
  889. n->lefthand = lcons(yyvsp[-5].node, NULL);
  890. n->oper = lcons(">",NIL);
  891. n->useor = false;
  892. n->subLinkType = ALL_SUBLINK;
  893. n->subselect = yyvsp[-1].node;
  894. yyval.node = (Node *)n;
  895. ;
  896.     break;}
  897. case 750:
  898. #line 4273 "gram.y"
  899. {
  900. SubLink *n = makeNode(SubLink);
  901. n->lefthand = lcons(yyvsp[-5].node, NULL);
  902. n->oper = lcons("=",NIL);
  903. n->useor = false;
  904. n->subLinkType = ALL_SUBLINK;
  905. n->subselect = yyvsp[-1].node;
  906. yyval.node = (Node *)n;
  907. ;
  908.     break;}
  909. case 751:
  910. #line 4283 "gram.y"
  911. { yyval.node = makeA_Expr(AND, NULL, yyvsp[-2].node, yyvsp[0].node); ;
  912.     break;}
  913. case 752:
  914. #line 4285 "gram.y"
  915. { yyval.node = makeA_Expr(OR, NULL, yyvsp[-2].node, yyvsp[0].node); ;
  916.     break;}
  917. case 753:
  918. #line 4287 "gram.y"
  919. { yyval.node = makeA_Expr(NOT, NULL, NULL, yyvsp[0].node); ;
  920.     break;}
  921. case 754:
  922. #line 4289 "gram.y"
  923. { yyval.node = yyvsp[0].node; ;
  924.     break;}
  925. case 755:
  926. #line 4298 "gram.y"
  927. {
  928. yyvsp[-1].attr->indirection = yyvsp[0].list;
  929. yyval.node = (Node *)yyvsp[-1].attr;
  930. ;
  931.     break;}
  932. case 756:
  933. #line 4303 "gram.y"
  934. { yyval.node = yyvsp[0].node;  ;
  935.     break;}
  936. case 757:
  937. #line 4305 "gram.y"
  938. {
  939. /* could be a column name or a relation_name */
  940. Ident *n = makeNode(Ident);
  941. n->name = yyvsp[0].str;
  942. n->indirection = NULL;
  943. yyval.node = (Node *)n;
  944. ;
  945.     break;}
  946. case 758:
  947. #line 4313 "gram.y"
  948. { yyval.node = doNegate(yyvsp[0].node); ;
  949.     break;}
  950. case 759:
  951. #line 4315 "gram.y"
  952. { yyval.node = makeA_Expr(OP, "%", NULL, yyvsp[0].node); ;
  953.     break;}
  954. case 760:
  955. #line 4317 "gram.y"
  956. { yyval.node = makeA_Expr(OP, "^", NULL, yyvsp[0].node); ;
  957.     break;}
  958. case 761:
  959. #line 4319 "gram.y"
  960. { yyval.node = makeA_Expr(OP, "%", yyvsp[-1].node, NULL); ;
  961.     break;}
  962. case 762:
  963. #line 4321 "gram.y"
  964. { yyval.node = makeA_Expr(OP, "^", yyvsp[-1].node, NULL); ;
  965.     break;}
  966. case 763:
  967. #line 4323 "gram.y"
  968. { yyval.node = makeA_Expr(OP, "+", yyvsp[-2].node, yyvsp[0].node); ;
  969.     break;}
  970. case 764:
  971. #line 4325 "gram.y"
  972. { yyval.node = makeA_Expr(OP, "-", yyvsp[-2].node, yyvsp[0].node); ;
  973.     break;}
  974. case 765:
  975. #line 4327 "gram.y"
  976. { yyval.node = makeA_Expr(OP, "/", yyvsp[-2].node, yyvsp[0].node); ;
  977.     break;}
  978. case 766:
  979. #line 4329 "gram.y"
  980. { yyval.node = makeA_Expr(OP, "%", yyvsp[-2].node, yyvsp[0].node); ;
  981.     break;}
  982. case 767:
  983. #line 4331 "gram.y"
  984. { yyval.node = makeA_Expr(OP, "^", yyvsp[-2].node, yyvsp[0].node); ;
  985.     break;}
  986. case 768:
  987. #line 4333 "gram.y"
  988. { yyval.node = makeA_Expr(OP, "*", yyvsp[-2].node, yyvsp[0].node); ;
  989.     break;}
  990. case 769:
  991. #line 4335 "gram.y"
  992. { yyval.node = makeA_Expr(OP, ":", NULL, yyvsp[0].node); ;
  993.     break;}
  994. case 770:
  995. #line 4337 "gram.y"
  996. { yyval.node = makeA_Expr(OP, ";", NULL, yyvsp[0].node); ;
  997.     break;}
  998. case 771:
  999. #line 4339 "gram.y"
  1000. { yyval.node = makeA_Expr(OP, "|", NULL, yyvsp[0].node); ;
  1001.     break;}
  1002. case 772:
  1003. #line 4341 "gram.y"
  1004. {
  1005. yyval.node = (Node *)yyvsp[-2].node;
  1006. /* AexprConst can be either A_Const or ParamNo */
  1007. if (nodeTag(yyvsp[-2].node) == T_A_Const) {
  1008. ((A_Const *)yyvsp[-2].node)->typename = yyvsp[0].typnam;
  1009. } else if (nodeTag(yyvsp[-2].node) == T_Param) {
  1010. ((ParamNo *)yyvsp[-2].node)->typename = yyvsp[0].typnam;
  1011. /* otherwise, try to transform to a function call */
  1012. } else {
  1013. FuncCall *n = makeNode(FuncCall);
  1014. n->funcname = yyvsp[0].typnam->name;
  1015. n->args = lcons(yyvsp[-2].node,NIL);
  1016. yyval.node = (Node *)n;
  1017. }
  1018. ;
  1019.     break;}
  1020. case 773:
  1021. #line 4357 "gram.y"
  1022. {
  1023. yyval.node = (Node *)yyvsp[-3].node;
  1024. /* AexprConst can be either A_Const or ParamNo */
  1025. if (nodeTag(yyvsp[-3].node) == T_A_Const) {
  1026. ((A_Const *)yyvsp[-3].node)->typename = yyvsp[-1].typnam;
  1027. } else if (nodeTag(yyvsp[-3].node) == T_Param) {
  1028. ((ParamNo *)yyvsp[-3].node)->typename = yyvsp[-1].typnam;
  1029. /* otherwise, try to transform to a function call */
  1030. } else {
  1031. FuncCall *n = makeNode(FuncCall);
  1032. n->funcname = yyvsp[-1].typnam->name;
  1033. n->args = lcons(yyvsp[-3].node,NIL);
  1034. yyval.node = (Node *)n;
  1035. }
  1036. ;
  1037.     break;}
  1038. case 774:
  1039. #line 4373 "gram.y"
  1040. { yyval.node = yyvsp[-1].node; ;
  1041.     break;}
  1042. case 775:
  1043. #line 4375 "gram.y"
  1044. { yyval.node = makeIndexable(yyvsp[-1].str,yyvsp[-2].node,yyvsp[0].node); ;
  1045.     break;}
  1046. case 776:
  1047. #line 4377 "gram.y"
  1048. { yyval.node = makeA_Expr(OP, yyvsp[-1].str, NULL, yyvsp[0].node); ;
  1049.     break;}
  1050. case 777:
  1051. #line 4379 "gram.y"
  1052. { yyval.node = makeA_Expr(OP, yyvsp[0].str, yyvsp[-1].node, NULL); ;
  1053.     break;}
  1054. case 778:
  1055. #line 4381 "gram.y"
  1056. {
  1057. FuncCall *n = makeNode(FuncCall);
  1058. n->funcname = yyvsp[-2].str;
  1059. n->args = NIL;
  1060. yyval.node = (Node *)n;
  1061. ;
  1062.     break;}
  1063. case 779:
  1064. #line 4388 "gram.y"
  1065. {
  1066. FuncCall *n = makeNode(FuncCall);
  1067. n->funcname = yyvsp[-3].str;
  1068. n->args = yyvsp[-1].list;
  1069. yyval.node = (Node *)n;
  1070. ;
  1071.     break;}
  1072. case 780:
  1073. #line 4395 "gram.y"
  1074. {
  1075. A_Const *n = makeNode(A_Const);
  1076. TypeName *t = makeNode(TypeName);
  1077. n->val.type = T_String;
  1078. n->val.val.str = "now";
  1079. n->typename = t;
  1080. t->name = xlateSqlType("date");
  1081. t->setof = FALSE;
  1082. t->typmod = -1;
  1083. yyval.node = (Node *)n;
  1084. ;
  1085.     break;}
  1086. case 781:
  1087. #line 4410 "gram.y"
  1088. {
  1089. A_Const *n = makeNode(A_Const);
  1090. TypeName *t = makeNode(TypeName);
  1091. n->val.type = T_String;
  1092. n->val.val.str = "now";
  1093. n->typename = t;
  1094. t->name = xlateSqlType("time");
  1095. t->setof = FALSE;
  1096. t->typmod = -1;
  1097. yyval.node = (Node *)n;
  1098. ;
  1099.     break;}
  1100. case 782:
  1101. #line 4425 "gram.y"
  1102. {
  1103. FuncCall *n = makeNode(FuncCall);
  1104. A_Const *s = makeNode(A_Const);
  1105. TypeName *t = makeNode(TypeName);
  1106. n->funcname = xlateSqlType("time");
  1107. n->args = lcons(s, NIL);
  1108. s->val.type = T_String;
  1109. s->val.val.str = "now";
  1110. s->typename = t;
  1111. t->name = xlateSqlType("time");
  1112. t->setof = FALSE;
  1113. t->typmod = -1;
  1114. if (yyvsp[-1].ival != 0)
  1115. elog(NOTICE,"CURRENT_TIME(%d) precision not implemented; zero used instead",yyvsp[-1].ival);
  1116. yyval.node = (Node *)n;
  1117. ;
  1118.     break;}
  1119. case 783:
  1120. #line 4447 "gram.y"
  1121. {
  1122. A_Const *n = makeNode(A_Const);
  1123. TypeName *t = makeNode(TypeName);
  1124. n->val.type = T_String;
  1125. n->val.val.str = "now";
  1126. n->typename = t;
  1127. t->name = xlateSqlType("timestamp");
  1128. t->setof = FALSE;
  1129. t->typmod = -1;
  1130. yyval.node = (Node *)n;
  1131. ;
  1132.     break;}
  1133. case 784:
  1134. #line 4462 "gram.y"
  1135. {
  1136. FuncCall *n = makeNode(FuncCall);
  1137. A_Const *s = makeNode(A_Const);
  1138. TypeName *t = makeNode(TypeName);
  1139. n->funcname = xlateSqlType("timestamp");
  1140. n->args = lcons(s, NIL);
  1141. s->val.type = T_String;
  1142. s->val.val.str = "now";
  1143. s->typename = t;
  1144. t->name = xlateSqlType("timestamp");
  1145. t->setof = FALSE;
  1146. t->typmod = -1;
  1147. if (yyvsp[-1].ival != 0)
  1148. elog(NOTICE,"CURRENT_TIMESTAMP(%d) precision not implemented; zero used instead",yyvsp[-1].ival);
  1149. yyval.node = (Node *)n;
  1150. ;
  1151.     break;}
  1152. case 785:
  1153. #line 4484 "gram.y"
  1154. {
  1155. FuncCall *n = makeNode(FuncCall);
  1156. n->funcname = "getpgusername";
  1157. n->args = NIL;
  1158. yyval.node = (Node *)n;
  1159. ;
  1160.     break;}
  1161. case 786:
  1162. #line 4491 "gram.y"
  1163. {
  1164. FuncCall *n = makeNode(FuncCall);
  1165. n->funcname = "getpgusername";
  1166. n->args = NIL;
  1167. yyval.node = (Node *)n;
  1168. ;
  1169.     break;}
  1170. case 787:
  1171. #line 4498 "gram.y"
  1172. {
  1173. FuncCall *n = makeNode(FuncCall);
  1174. n->funcname = "strpos";
  1175. n->args = yyvsp[-1].list;
  1176. yyval.node = (Node *)n;
  1177. ;
  1178.     break;}
  1179. case 788:
  1180. #line 4505 "gram.y"
  1181. {
  1182. FuncCall *n = makeNode(FuncCall);
  1183. n->funcname = "substr";
  1184. n->args = yyvsp[-1].list;
  1185. yyval.node = (Node *)n;
  1186. ;
  1187.     break;}
  1188. case 789:
  1189. #line 4513 "gram.y"
  1190. {
  1191. FuncCall *n = makeNode(FuncCall);
  1192. n->funcname = "btrim";
  1193. n->args = yyvsp[-1].list;
  1194. yyval.node = (Node *)n;
  1195. ;
  1196.     break;}
  1197. case 790:
  1198. #line 4520 "gram.y"
  1199. {
  1200. FuncCall *n = makeNode(FuncCall);
  1201. n->funcname = "ltrim";
  1202. n->args = yyvsp[-1].list;
  1203. yyval.node = (Node *)n;
  1204. ;
  1205.     break;}
  1206. case 791:
  1207. #line 4527 "gram.y"
  1208. {
  1209. FuncCall *n = makeNode(FuncCall);
  1210. n->funcname = "rtrim";
  1211. n->args = yyvsp[-1].list;
  1212. yyval.node = (Node *)n;
  1213. ;
  1214.     break;}
  1215. case 792:
  1216. #line 4534 "gram.y"
  1217. {
  1218. FuncCall *n = makeNode(FuncCall);
  1219. n->funcname = "btrim";
  1220. n->args = yyvsp[-1].list;
  1221. yyval.node = (Node *)n;
  1222. ;
  1223.     break;}
  1224. case 793:
  1225. #line 4543 "gram.y"
  1226. {
  1227. A_Indices *ai = makeNode(A_Indices);
  1228. ai->lidx = NULL;
  1229. ai->uidx = yyvsp[-2].node;
  1230. yyval.list = lcons(ai, yyvsp[0].list);
  1231. ;
  1232.     break;}
  1233. case 794:
  1234. #line 4550 "gram.y"
  1235. {
  1236. A_Indices *ai = makeNode(A_Indices);
  1237. ai->lidx = yyvsp[-4].node;
  1238. ai->uidx = yyvsp[-2].node;
  1239. yyval.list = lcons(ai, yyvsp[0].list);
  1240. ;
  1241.     break;}
  1242. case 795:
  1243. #line 4557 "gram.y"
  1244. { yyval.list = NIL; ;
  1245.     break;}
  1246. case 796:
  1247. #line 4561 "gram.y"
  1248. { yyval.list = lcons(yyvsp[0].node, NIL); ;
  1249.     break;}
  1250. case 797:
  1251. #line 4563 "gram.y"
  1252. { yyval.list = lappend(yyvsp[-2].list, yyvsp[0].node); ;
  1253.     break;}
  1254. case 798:
  1255. #line 4565 "gram.y"
  1256. { yyval.list = lappend(yyvsp[-2].list, yyvsp[0].node); ;
  1257.     break;}
  1258. case 799:
  1259. #line 4569 "gram.y"
  1260. {
  1261. A_Const *n = makeNode(A_Const);
  1262. n->val.type = T_String;
  1263. n->val.val.str = yyvsp[-2].str;
  1264. yyval.list = lappend(lcons((Node *)n,NIL), yyvsp[0].node);
  1265. ;
  1266.     break;}
  1267. case 800:
  1268. #line 4576 "gram.y"
  1269. { yyval.list = NIL; ;
  1270.     break;}
  1271. case 801:
  1272. #line 4579 "gram.y"
  1273. { yyval.str = yyvsp[0].str; ;
  1274.     break;}
  1275. case 802:
  1276. #line 4580 "gram.y"
  1277. { yyval.str = "tz_hour"; ;
  1278.     break;}
  1279. case 803:
  1280. #line 4581 "gram.y"
  1281. { yyval.str = "tz_minute"; ;
  1282.     break;}
  1283. case 804:
  1284. #line 4585 "gram.y"
  1285. { yyval.list = makeList(yyvsp[0].node, yyvsp[-2].node, -1); ;
  1286.     break;}
  1287. case 805:
  1288. #line 4587 "gram.y"
  1289. { yyval.list = NIL; ;
  1290.     break;}
  1291. case 806:
  1292. #line 4591 "gram.y"
  1293. {
  1294. yyvsp[-1].attr->indirection = yyvsp[0].list;
  1295. yyval.node = (Node *)yyvsp[-1].attr;
  1296. ;
  1297.     break;}
  1298. case 807:
  1299. #line 4596 "gram.y"
  1300. { yyval.node = yyvsp[0].node;  ;
  1301.     break;}
  1302. case 808:
  1303. #line 4598 "gram.y"
  1304. { yyval.node = makeA_Expr(OP, "-", NULL, yyvsp[0].node); ;
  1305.     break;}
  1306. case 809:
  1307. #line 4600 "gram.y"
  1308. { yyval.node = makeA_Expr(OP, "+", yyvsp[-2].node, yyvsp[0].node); ;
  1309.     break;}
  1310. case 810:
  1311. #line 4602 "gram.y"
  1312. { yyval.node = makeA_Expr(OP, "-", yyvsp[-2].node, yyvsp[0].node); ;
  1313.     break;}
  1314. case 811:
  1315. #line 4604 "gram.y"
  1316. { yyval.node = makeA_Expr(OP, "/", yyvsp[-2].node, yyvsp[0].node); ;
  1317.     break;}
  1318. case 812:
  1319. #line 4606 "gram.y"
  1320. { yyval.node = makeA_Expr(OP, "%", yyvsp[-2].node, yyvsp[0].node); ;
  1321.     break;}
  1322. case 813:
  1323. #line 4608 "gram.y"
  1324. { yyval.node = makeA_Expr(OP, "*", yyvsp[-2].node, yyvsp[0].node); ;
  1325.     break;}
  1326. case 814:
  1327. #line 4610 "gram.y"
  1328. { yyval.node = makeA_Expr(OP, "|", NULL, yyvsp[0].node); ;
  1329.     break;}
  1330. case 815:
  1331. #line 4612 "gram.y"
  1332. {
  1333. yyval.node = (Node *)yyvsp[-2].node;
  1334. /* AexprConst can be either A_Const or ParamNo */
  1335. if (nodeTag(yyvsp[-2].node) == T_A_Const) {
  1336. ((A_Const *)yyvsp[-2].node)->typename = yyvsp[0].typnam;
  1337. } else if (nodeTag(yyvsp[-2].node) == T_Param) {
  1338. ((ParamNo *)yyvsp[-2].node)->typename = yyvsp[0].typnam;
  1339. /* otherwise, try to transform to a function call */
  1340. } else {
  1341. FuncCall *n = makeNode(FuncCall);
  1342. n->funcname = yyvsp[0].typnam->name;
  1343. n->args = lcons(yyvsp[-2].node,NIL);
  1344. yyval.node = (Node *)n;
  1345. }
  1346. ;
  1347.     break;}
  1348. case 816:
  1349. #line 4628 "gram.y"
  1350. {
  1351. yyval.node = (Node *)yyvsp[-3].node;
  1352. /* AexprConst can be either A_Const or ParamNo */
  1353. if (nodeTag(yyvsp[-3].node) == T_A_Const) {
  1354. ((A_Const *)yyvsp[-3].node)->typename = yyvsp[-1].typnam;
  1355. } else if (nodeTag(yyvsp[-3].node) == T_Param) {
  1356. ((ParamNo *)yyvsp[-3].node)->typename = yyvsp[-1].typnam;
  1357. /* otherwise, try to transform to a function call */
  1358. } else {
  1359. FuncCall *n = makeNode(FuncCall);
  1360. n->funcname = yyvsp[-1].typnam->name;
  1361. n->args = lcons(yyvsp[-3].node,NIL);
  1362. yyval.node = (Node *)n;
  1363. }
  1364. ;
  1365.     break;}
  1366. case 817:
  1367. #line 4644 "gram.y"
  1368. { yyval.node = yyvsp[-1].node; ;
  1369.     break;}
  1370. case 818:
  1371. #line 4646 "gram.y"
  1372. { yyval.node = makeA_Expr(OP, yyvsp[-1].str, yyvsp[-2].node, yyvsp[0].node); ;
  1373.     break;}
  1374. case 819:
  1375. #line 4648 "gram.y"
  1376. { yyval.node = makeA_Expr(OP, yyvsp[-1].str, NULL, yyvsp[0].node); ;
  1377.     break;}
  1378. case 820:
  1379. #line 4650 "gram.y"
  1380. { yyval.node = makeA_Expr(OP, yyvsp[0].str, yyvsp[-1].node, NULL); ;
  1381.     break;}
  1382. case 821:
  1383. #line 4652 "gram.y"
  1384. {
  1385. /* could be a column name or a relation_name */
  1386. Ident *n = makeNode(Ident);
  1387. n->name = yyvsp[0].str;
  1388. n->indirection = NULL;
  1389. yyval.node = (Node *)n;
  1390. ;
  1391.     break;}
  1392. case 822:
  1393. #line 4660 "gram.y"
  1394. {
  1395. FuncCall *n = makeNode(FuncCall);
  1396. n->funcname = yyvsp[-2].str;
  1397. n->args = NIL;
  1398. yyval.node = (Node *)n;
  1399. ;
  1400.     break;}
  1401. case 823:
  1402. #line 4667 "gram.y"
  1403. {
  1404. FuncCall *n = makeNode(FuncCall);
  1405. n->funcname = yyvsp[-3].str;
  1406. n->args = yyvsp[-1].list;
  1407. yyval.node = (Node *)n;
  1408. ;
  1409.     break;}
  1410. case 824:
  1411. #line 4674 "gram.y"
  1412. {
  1413. FuncCall *n = makeNode(FuncCall);
  1414. n->funcname = "strpos";
  1415. n->args = yyvsp[-1].list;
  1416. yyval.node = (Node *)n;
  1417. ;
  1418.     break;}
  1419. case 825:
  1420. #line 4681 "gram.y"
  1421. {
  1422. FuncCall *n = makeNode(FuncCall);
  1423. n->funcname = "substr";
  1424. n->args = yyvsp[-1].list;
  1425. yyval.node = (Node *)n;
  1426. ;
  1427.     break;}
  1428. case 826:
  1429. #line 4689 "gram.y"
  1430. {
  1431. FuncCall *n = makeNode(FuncCall);
  1432. n->funcname = "btrim";
  1433. n->args = yyvsp[-1].list;
  1434. yyval.node = (Node *)n;
  1435. ;
  1436.     break;}
  1437. case 827:
  1438. #line 4696 "gram.y"
  1439. {
  1440. FuncCall *n = makeNode(FuncCall);
  1441. n->funcname = "ltrim";
  1442. n->args = yyvsp[-1].list;
  1443. yyval.node = (Node *)n;
  1444. ;
  1445.     break;}
  1446. case 828:
  1447. #line 4703 "gram.y"
  1448. {
  1449. FuncCall *n = makeNode(FuncCall);
  1450. n->funcname = "rtrim";
  1451. n->args = yyvsp[-1].list;
  1452. yyval.node = (Node *)n;
  1453. ;
  1454.     break;}
  1455. case 829:
  1456. #line 4710 "gram.y"
  1457. {
  1458. FuncCall *n = makeNode(FuncCall);
  1459. n->funcname = "btrim";
  1460. n->args = yyvsp[-1].list;
  1461. yyval.node = (Node *)n;
  1462. ;
  1463.     break;}
  1464. case 830:
  1465. #line 4719 "gram.y"
  1466. {
  1467. yyval.list = nconc(nconc(yyvsp[-2].list,yyvsp[-1].list),yyvsp[0].list);
  1468. ;
  1469.     break;}
  1470. case 831:
  1471. #line 4723 "gram.y"
  1472. { yyval.list = NIL; ;
  1473.     break;}
  1474. case 832:
  1475. #line 4727 "gram.y"
  1476. { yyval.list = yyvsp[0].list; ;
  1477.     break;}
  1478. case 833:
  1479. #line 4729 "gram.y"
  1480. {
  1481. A_Const *n = makeNode(A_Const);
  1482. n->val.type = T_Integer;
  1483. n->val.val.ival = 1;
  1484. yyval.list = lcons((Node *)n,NIL);
  1485. ;
  1486.     break;}
  1487. case 834:
  1488. #line 4738 "gram.y"
  1489. { yyval.list = yyvsp[0].list; ;
  1490.     break;}
  1491. case 835:
  1492. #line 4740 "gram.y"
  1493. { yyval.list = NIL; ;
  1494.     break;}
  1495. case 836:
  1496. #line 4744 "gram.y"
  1497. { yyval.list = lappend(yyvsp[0].list, yyvsp[-2].node); ;
  1498.     break;}
  1499. case 837:
  1500. #line 4746 "gram.y"
  1501. { yyval.list = yyvsp[0].list; ;
  1502.     break;}
  1503. case 838:
  1504. #line 4748 "gram.y"
  1505. { yyval.list = yyvsp[0].list; ;
  1506.     break;}
  1507. case 839:
  1508. #line 4752 "gram.y"
  1509. {
  1510. SubLink *n = makeNode(SubLink);
  1511. n->subselect = yyvsp[0].node;
  1512. yyval.node = (Node *)n;
  1513. ;
  1514.     break;}
  1515. case 840:
  1516. #line 4758 "gram.y"
  1517. { yyval.node = yyvsp[0].node; ;
  1518.     break;}
  1519. case 841:
  1520. #line 4762 "gram.y"
  1521. { yyval.node = makeA_Expr(OP, "=", lfirst(saved_In_Expr), yyvsp[0].node); ;
  1522.     break;}
  1523. case 842:
  1524. #line 4764 "gram.y"
  1525. { yyval.node = makeA_Expr(OR, NULL, yyvsp[-2].node,
  1526. makeA_Expr(OP, "=", lfirst(saved_In_Expr), yyvsp[0].node));
  1527. ;
  1528.     break;}
  1529. case 843:
  1530. #line 4770 "gram.y"
  1531. {
  1532. SubLink *n = makeNode(SubLink);
  1533. n->subselect = yyvsp[0].node;
  1534. yyval.node = (Node *)n;
  1535. ;
  1536.     break;}
  1537. case 844:
  1538. #line 4776 "gram.y"
  1539. { yyval.node = yyvsp[0].node; ;
  1540.     break;}
  1541. case 845:
  1542. #line 4780 "gram.y"
  1543. { yyval.node = makeA_Expr(OP, "<>", lfirst(saved_In_Expr), yyvsp[0].node); ;
  1544.     break;}
  1545. case 846:
  1546. #line 4782 "gram.y"
  1547. { yyval.node = makeA_Expr(AND, NULL, yyvsp[-2].node,
  1548. makeA_Expr(OP, "<>", lfirst(saved_In_Expr), yyvsp[0].node));
  1549. ;
  1550.     break;}
  1551. case 847:
  1552. #line 4803 "gram.y"
  1553. {
  1554. CaseExpr *c = makeNode(CaseExpr);
  1555. c->arg = yyvsp[-3].node;
  1556. c->args = yyvsp[-2].list;
  1557. c->defresult = yyvsp[-1].node;
  1558. yyval.node = (Node *)c;
  1559. ;
  1560.     break;}
  1561. case 848:
  1562. #line 4811 "gram.y"
  1563. {
  1564. CaseExpr *c = makeNode(CaseExpr);
  1565. CaseWhen *w = makeNode(CaseWhen);
  1566. /*
  1567. A_Const *n = makeNode(A_Const);
  1568. n->val.type = T_Null;
  1569. w->result = (Node *)n;
  1570. */
  1571. w->expr = makeA_Expr(OP, "=", yyvsp[-3].node, yyvsp[-1].node);
  1572. c->args = lcons(w, NIL);
  1573. c->defresult = yyvsp[-3].node;
  1574. yyval.node = (Node *)c;
  1575. ;
  1576.     break;}
  1577. case 849:
  1578. #line 4825 "gram.y"
  1579. {
  1580. CaseExpr *c = makeNode(CaseExpr);
  1581. CaseWhen *w;
  1582. List *l;
  1583. foreach (l,yyvsp[-1].list)
  1584. {
  1585. w = makeNode(CaseWhen);
  1586. w->expr = makeA_Expr(NOTNULL, NULL, lfirst(l), NULL);
  1587. w->result = lfirst(l);
  1588. c->args = lappend(c->args, w);
  1589. }
  1590. yyval.node = (Node *)c;
  1591. ;
  1592.     break;}
  1593. case 850:
  1594. #line 4841 "gram.y"
  1595. { yyval.list = lappend(yyvsp[-1].list, yyvsp[0].node); ;
  1596.     break;}
  1597. case 851:
  1598. #line 4843 "gram.y"
  1599. { yyval.list = lcons(yyvsp[0].node, NIL); ;
  1600.     break;}
  1601. case 852:
  1602. #line 4847 "gram.y"
  1603. {
  1604. CaseWhen *w = makeNode(CaseWhen);
  1605. w->expr = yyvsp[-2].node;
  1606. w->result = yyvsp[0].node;
  1607. yyval.node = (Node *)w;
  1608. ;
  1609.     break;}
  1610. case 853:
  1611. #line 4855 "gram.y"
  1612. { yyval.node = yyvsp[0].node; ;
  1613.     break;}
  1614. case 854:
  1615. #line 4856 "gram.y"
  1616. { yyval.node = NULL; ;
  1617.     break;}
  1618. case 855:
  1619. #line 4860 "gram.y"
  1620. {
  1621. yyvsp[-1].attr->indirection = yyvsp[0].list;
  1622. yyval.node = (Node *)yyvsp[-1].attr;
  1623. ;
  1624.     break;}
  1625. case 856:
  1626. #line 4865 "gram.y"
  1627. {
  1628. /* could be a column name or a relation_name */
  1629. Ident *n = makeNode(Ident);
  1630. n->name = yyvsp[0].str;
  1631. n->indirection = NULL;
  1632. yyval.node = (Node *)n;
  1633. ;
  1634.     break;}
  1635. case 857:
  1636. #line 4873 "gram.y"
  1637. { yyval.node = NULL; ;
  1638.     break;}
  1639. case 858:
  1640. #line 4877 "gram.y"
  1641. {
  1642. yyval.attr = makeNode(Attr);
  1643. yyval.attr->relname = yyvsp[-2].str;
  1644. yyval.attr->paramNo = NULL;
  1645. yyval.attr->attrs = yyvsp[0].list;
  1646. yyval.attr->indirection = NULL;
  1647. ;
  1648.     break;}
  1649. case 859:
  1650. #line 4885 "gram.y"
  1651. {
  1652. yyval.attr = makeNode(Attr);
  1653. yyval.attr->relname = NULL;
  1654. yyval.attr->paramNo = yyvsp[-2].paramno;
  1655. yyval.attr->attrs = yyvsp[0].list;
  1656. yyval.attr->indirection = NULL;
  1657. ;
  1658.     break;}
  1659. case 860:
  1660. #line 4895 "gram.y"
  1661. { yyval.list = lcons(makeString(yyvsp[0].str), NIL); ;
  1662.     break;}
  1663. case 861:
  1664. #line 4897 "gram.y"
  1665. { yyval.list = lappend(yyvsp[-2].list, makeString(yyvsp[0].str)); ;
  1666.     break;}
  1667. case 862:
  1668. #line 4899 "gram.y"
  1669. { yyval.list = lappend(yyvsp[-2].list, makeString("*")); ;
  1670.     break;}
  1671. case 863:
  1672. #line 4910 "gram.y"
  1673. { yyval.list = lappend(yyvsp[-2].list,yyvsp[0].target);  ;
  1674.     break;}
  1675. case 864:
  1676. #line 4912 "gram.y"
  1677. { yyval.list = lcons(yyvsp[0].target, NIL);  ;
  1678.     break;}
  1679. case 865:
  1680. #line 4914 "gram.y"
  1681. {
  1682. ResTarget *rt = makeNode(ResTarget);
  1683. Attr *att = makeNode(Attr);
  1684. att->relname = "*";
  1685. att->paramNo = NULL;
  1686. att->attrs = NULL;
  1687. att->indirection = NIL;
  1688. rt->name = NULL;
  1689. rt->indirection = NULL;
  1690. rt->val = (Node *)att;
  1691. yyval.list = lcons(rt, NIL);
  1692. ;
  1693.     break;}
  1694. case 866:
  1695. #line 4929 "gram.y"
  1696. {
  1697. yyval.target = makeNode(ResTarget);
  1698. yyval.target->name = yyvsp[-3].str;
  1699. yyval.target->indirection = yyvsp[-2].list;
  1700. yyval.target->val = (Node *)yyvsp[0].node;
  1701. ;
  1702.     break;}
  1703. case 867:
  1704. #line 4936 "gram.y"
  1705. {
  1706. yyval.target = makeNode(ResTarget);
  1707. yyval.target->name = NULL;
  1708. yyval.target->indirection = yyvsp[0].list;
  1709. yyval.target->val = (Node *)yyvsp[-1].attr;
  1710. ;
  1711.     break;}
  1712. case 868:
  1713. #line 4943 "gram.y"
  1714. {
  1715. Attr *att = makeNode(Attr);
  1716. att->relname = yyvsp[-2].str;
  1717. att->paramNo = NULL;
  1718. att->attrs = lcons(makeString("*"), NIL);
  1719. att->indirection = NIL;
  1720. yyval.target = makeNode(ResTarget);
  1721. yyval.target->name = NULL;
  1722. yyval.target->indirection = NULL;
  1723. yyval.target->val = (Node *)att;
  1724. ;
  1725.     break;}
  1726. case 869:
  1727. #line 4962 "gram.y"
  1728. { yyval.list = lappend(yyvsp[-2].list, yyvsp[0].target);  ;
  1729.     break;}
  1730. case 870:
  1731. #line 4964 "gram.y"
  1732. { yyval.list = lcons(yyvsp[0].target, NIL);  ;
  1733.     break;}
  1734. case 871:
  1735. #line 4969 "gram.y"
  1736. {
  1737. yyval.target = makeNode(ResTarget);
  1738. yyval.target->name = yyvsp[0].str;
  1739. yyval.target->indirection = NULL;
  1740. yyval.target->val = (Node *)yyvsp[-2].node;
  1741. ;
  1742.     break;}
  1743. case 872:
  1744. #line 4976 "gram.y"
  1745. {
  1746. yyval.target = makeNode(ResTarget);
  1747. yyval.target->name = NULL;
  1748. yyval.target->indirection = NULL;
  1749. yyval.target->val = (Node *)yyvsp[0].node;
  1750. ;
  1751.     break;}
  1752. case 873:
  1753. #line 4983 "gram.y"
  1754. {
  1755. Attr *att = makeNode(Attr);
  1756. att->relname = yyvsp[-2].str;
  1757. att->paramNo = NULL;
  1758. att->attrs = lcons(makeString("*"), NIL);
  1759. att->indirection = NIL;
  1760. yyval.target = makeNode(ResTarget);
  1761. yyval.target->name = NULL;
  1762. yyval.target->indirection = NULL;
  1763. yyval.target->val = (Node *)att;
  1764. ;
  1765.     break;}
  1766. case 874:
  1767. #line 4995 "gram.y"
  1768. {
  1769. Attr *att = makeNode(Attr);
  1770. att->relname = "*";
  1771. att->paramNo = NULL;
  1772. att->attrs = NULL;
  1773. att->indirection = NIL;
  1774. yyval.target = makeNode(ResTarget);
  1775. yyval.target->name = NULL;
  1776. yyval.target->indirection = NULL;
  1777. yyval.target->val = (Node *)att;
  1778. ;
  1779.     break;}
  1780. case 875:
  1781. #line 5008 "gram.y"
  1782. { yyval.str = yyvsp[0].str; ;
  1783.     break;}
  1784. case 876:
  1785. #line 5009 "gram.y"
  1786. { yyval.str = NULL; ;
  1787.     break;}
  1788. case 877:
  1789. #line 5013 "gram.y"
  1790. {
  1791. yyval.str = yyvsp[0].str;
  1792. StrNCpy(saved_relname, yyvsp[0].str, NAMEDATALEN);
  1793. ;
  1794.     break;}
  1795. case 878:
  1796. #line 5018 "gram.y"
  1797. {
  1798. /* disallow refs to variable system tables */
  1799. if (strcmp(LogRelationName, yyvsp[0].str) == 0
  1800.    || strcmp(VariableRelationName, yyvsp[0].str) == 0)
  1801. elog(ERROR,"%s cannot be accessed by users",yyvsp[0].str);
  1802. else
  1803. yyval.str = yyvsp[0].str;
  1804. StrNCpy(saved_relname, yyvsp[0].str, NAMEDATALEN);
  1805. ;
  1806.     break;}
  1807. case 879:
  1808. #line 5029 "gram.y"
  1809. { yyval.str = yyvsp[0].str; ;
  1810.     break;}
  1811. case 880:
  1812. #line 5030 "gram.y"
  1813. { yyval.str = yyvsp[0].str; ;
  1814.     break;}
  1815. case 881:
  1816. #line 5031 "gram.y"
  1817. { yyval.str = yyvsp[0].str; ;
  1818.     break;}
  1819. case 882:
  1820. #line 5032 "gram.y"
  1821. { yyval.str = yyvsp[0].str; ;
  1822.     break;}
  1823. case 883:
  1824. #line 5033 "gram.y"
  1825. { yyval.str = yyvsp[0].str; ;
  1826.     break;}
  1827. case 884:
  1828. #line 5039 "gram.y"
  1829. { yyval.str = yyvsp[0].str; ;
  1830.     break;}
  1831. case 885:
  1832. #line 5040 "gram.y"
  1833. { yyval.str = xlateSqlFunc(yyvsp[0].str); ;
  1834.     break;}
  1835. case 886:
  1836. #line 5042 "gram.y"
  1837. { yyval.str = yyvsp[0].str; ;
  1838.     break;}
  1839. case 887:
  1840. #line 5049 "gram.y"
  1841. {
  1842. A_Const *n = makeNode(A_Const);
  1843. n->val.type = T_Integer;
  1844. n->val.val.ival = yyvsp[0].ival;
  1845. yyval.node = (Node *)n;
  1846. ;
  1847.     break;}
  1848. case 888:
  1849. #line 5056 "gram.y"
  1850. {
  1851. A_Const *n = makeNode(A_Const);
  1852. n->val.type = T_Float;
  1853. n->val.val.dval = yyvsp[0].dval;
  1854. yyval.node = (Node *)n;
  1855. ;
  1856.     break;}
  1857. case 889:
  1858. #line 5063 "gram.y"
  1859. {
  1860. A_Const *n = makeNode(A_Const);
  1861. n->val.type = T_String;
  1862. n->val.val.str = yyvsp[0].str;
  1863. yyval.node = (Node *)n;
  1864. ;
  1865.     break;}
  1866. case 890:
  1867. #line 5070 "gram.y"
  1868. {
  1869. A_Const *n = makeNode(A_Const);
  1870. n->typename = yyvsp[-1].typnam;
  1871. n->val.type = T_String;
  1872. n->val.val.str = yyvsp[0].str;
  1873. yyval.node = (Node *)n;
  1874. ;
  1875.     break;}
  1876. case 891:
  1877. #line 5078 "gram.y"
  1878. { yyval.node = (Node *)yyvsp[0].paramno;  ;
  1879.     break;}
  1880. case 892:
  1881. #line 5080 "gram.y"
  1882. {
  1883. A_Const *n = makeNode(A_Const);
  1884. n->val.type = T_String;
  1885. n->val.val.str = "t";
  1886. n->typename = makeNode(TypeName);
  1887. n->typename->name = xlateSqlType("bool");
  1888. n->typename->typmod = -1;
  1889. yyval.node = (Node *)n;
  1890. ;
  1891.     break;}
  1892. case 893:
  1893. #line 5090 "gram.y"
  1894. {
  1895. A_Const *n = makeNode(A_Const);
  1896. n->val.type = T_String;
  1897. n->val.val.str = "f";
  1898. n->typename = makeNode(TypeName);
  1899. n->typename->name = xlateSqlType("bool");
  1900. n->typename->typmod = -1;
  1901. yyval.node = (Node *)n;
  1902. ;
  1903.     break;}
  1904. case 894:
  1905. #line 5102 "gram.y"
  1906. {
  1907. yyval.paramno = makeNode(ParamNo);
  1908. yyval.paramno->number = yyvsp[-1].ival;
  1909. yyval.paramno->indirection = yyvsp[0].list;
  1910. ;
  1911.     break;}
  1912. case 895:
  1913. #line 5109 "gram.y"
  1914. { yyval.ival = yyvsp[0].ival; ;
  1915.     break;}
  1916. case 896:
  1917. #line 5110 "gram.y"
  1918. { yyval.str = yyvsp[0].str; ;
  1919.     break;}
  1920. case 897:
  1921. #line 5111 "gram.y"
  1922. { yyval.str = yyvsp[0].str; ;
  1923.     break;}
  1924. case 898:
  1925. #line 5119 "gram.y"
  1926. { yyval.str = xlateSqlType(yyvsp[0].str); ;
  1927.     break;}
  1928. case 899:
  1929. #line 5121 "gram.y"
  1930. { yyval.str = xlateSqlType(yyvsp[0].str); ;
  1931.     break;}
  1932. case 900:
  1933. #line 5123 "gram.y"
  1934. { yyval.str = xlateSqlType(yyvsp[0].str); ;
  1935.     break;}
  1936. case 901:
  1937. #line 5133 "gram.y"
  1938. { yyval.str = yyvsp[0].str; ;
  1939.     break;}
  1940. case 902:
  1941. #line 5134 "gram.y"
  1942. { yyval.str = yyvsp[0].str; ;
  1943.     break;}
  1944. case 903:
  1945. #line 5135 "gram.y"
  1946. { yyval.str = "absolute"; ;
  1947.     break;}
  1948. case 904:
  1949. #line 5136 "gram.y"
  1950. { yyval.str = "access"; ;
  1951.     break;}
  1952. case 905:
  1953. #line 5137 "gram.y"
  1954. { yyval.str = "action"; ;
  1955.     break;}
  1956. case 906:
  1957. #line 5138 "gram.y"
  1958. { yyval.str = "after"; ;
  1959.     break;}
  1960. case 907:
  1961. #line 5139 "gram.y"
  1962. { yyval.str = "aggregate"; ;
  1963.     break;}
  1964. case 908:
  1965. #line 5140 "gram.y"
  1966. { yyval.str = "backward"; ;
  1967.     break;}
  1968. case 909:
  1969. #line 5141 "gram.y"
  1970. { yyval.str = "before"; ;
  1971.     break;}
  1972. case 910:
  1973. #line 5142 "gram.y"
  1974. { yyval.str = "cache"; ;
  1975.     break;}
  1976. case 911:
  1977. #line 5143 "gram.y"
  1978. { yyval.str = "committed"; ;
  1979.     break;}
  1980. case 912:
  1981. #line 5144 "gram.y"
  1982. { yyval.str = "createdb"; ;
  1983.     break;}
  1984. case 913:
  1985. #line 5145 "gram.y"
  1986. { yyval.str = "createuser"; ;
  1987.     break;}
  1988. case 914:
  1989. #line 5146 "gram.y"
  1990. { yyval.str = "cycle"; ;
  1991.     break;}
  1992. case 915:
  1993. #line 5147 "gram.y"
  1994. { yyval.str = "database"; ;
  1995.     break;}
  1996. case 916:
  1997. #line 5148 "gram.y"
  1998. { yyval.str = "delimiters"; ;
  1999.     break;}
  2000. case 917:
  2001. #line 5149 "gram.y"
  2002. { yyval.str = "double"; ;
  2003.     break;}
  2004. case 918:
  2005. #line 5150 "gram.y"
  2006. { yyval.str = "each"; ;
  2007.     break;}
  2008. case 919:
  2009. #line 5151 "gram.y"
  2010. { yyval.str = "encoding"; ;
  2011.     break;}
  2012. case 920:
  2013. #line 5152 "gram.y"
  2014. { yyval.str = "exclusive"; ;
  2015.     break;}
  2016. case 921:
  2017. #line 5153 "gram.y"
  2018. { yyval.str = "forward"; ;
  2019.     break;}
  2020. case 922:
  2021. #line 5154 "gram.y"
  2022. { yyval.str = "function"; ;
  2023.     break;}
  2024. case 923:
  2025. #line 5155 "gram.y"
  2026. { yyval.str = "handler"; ;
  2027.     break;}
  2028. case 924:
  2029. #line 5156 "gram.y"
  2030. { yyval.str = "increment"; ;
  2031.     break;}
  2032. case 925:
  2033. #line 5157 "gram.y"
  2034. { yyval.str = "index"; ;
  2035.     break;}
  2036. case 926:
  2037. #line 5158 "gram.y"
  2038. { yyval.str = "inherits"; ;
  2039.     break;}
  2040. case 927:
  2041. #line 5159 "gram.y"
  2042. { yyval.str = "insensitive"; ;
  2043.     break;}
  2044. case 928:
  2045. #line 5160 "gram.y"
  2046. { yyval.str = "instead"; ;
  2047.     break;}
  2048. case 929:
  2049. #line 5161 "gram.y"
  2050. { yyval.str = "isnull"; ;
  2051.     break;}
  2052. case 930:
  2053. #line 5162 "gram.y"
  2054. { yyval.str = "isolation"; ;
  2055.     break;}
  2056. case 931:
  2057. #line 5163 "gram.y"
  2058. { yyval.str = "key"; ;
  2059.     break;}
  2060. case 932:
  2061. #line 5164 "gram.y"
  2062. { yyval.str = "language"; ;
  2063.     break;}
  2064. case 933:
  2065. #line 5165 "gram.y"
  2066. { yyval.str = "lancompiler"; ;
  2067.     break;}
  2068. case 934:
  2069. #line 5166 "gram.y"
  2070. { yyval.str = "level"; ;
  2071.     break;}
  2072. case 935:
  2073. #line 5167 "gram.y"
  2074. { yyval.str = "location"; ;
  2075.     break;}
  2076. case 936:
  2077. #line 5168 "gram.y"
  2078. { yyval.str = "match"; ;
  2079.     break;}
  2080. case 937:
  2081. #line 5169 "gram.y"
  2082. { yyval.str = "maxvalue"; ;
  2083.     break;}
  2084. case 938:
  2085. #line 5170 "gram.y"
  2086. { yyval.str = "minvalue"; ;
  2087.     break;}
  2088. case 939:
  2089. #line 5171 "gram.y"
  2090. { yyval.str = "mode"; ;
  2091.     break;}
  2092. case 940:
  2093. #line 5172 "gram.y"
  2094. { yyval.str = "next"; ;
  2095.     break;}
  2096. case 941:
  2097. #line 5173 "gram.y"
  2098. { yyval.str = "nocreatedb"; ;
  2099.     break;}
  2100. case 942:
  2101. #line 5174 "gram.y"
  2102. { yyval.str = "nocreateuser"; ;
  2103.     break;}
  2104. case 943:
  2105. #line 5175 "gram.y"
  2106. { yyval.str = "nothing"; ;
  2107.     break;}
  2108. case 944:
  2109. #line 5176 "gram.y"
  2110. { yyval.str = "notnull"; ;
  2111.     break;}
  2112. case 945:
  2113. #line 5177 "gram.y"
  2114. { yyval.str = "of"; ;
  2115.     break;}
  2116. case 946:
  2117. #line 5178 "gram.y"
  2118. { yyval.str = "oids"; ;
  2119.     break;}
  2120. case 947:
  2121. #line 5179 "gram.y"
  2122. { yyval.str = "only"; ;
  2123.     break;}
  2124. case 948:
  2125. #line 5180 "gram.y"
  2126. { yyval.str = "operator"; ;
  2127.     break;}
  2128. case 949:
  2129. #line 5181 "gram.y"
  2130. { yyval.str = "option"; ;
  2131.     break;}
  2132. case 950:
  2133. #line 5182 "gram.y"
  2134. { yyval.str = "password"; ;
  2135.     break;}
  2136. case 951:
  2137. #line 5183 "gram.y"
  2138. { yyval.str = "prior"; ;
  2139.     break;}
  2140. case 952:
  2141. #line 5184 "gram.y"
  2142. { yyval.str = "privileges"; ;
  2143.     break;}
  2144. case 953:
  2145. #line 5185 "gram.y"
  2146. { yyval.str = "procedural"; ;
  2147.     break;}
  2148. case 954:
  2149. #line 5186 "gram.y"
  2150. { yyval.str = "read"; ;
  2151.     break;}
  2152. case 955:
  2153. #line 5187 "gram.y"
  2154. { yyval.str = "relative"; ;
  2155.     break;}
  2156. case 956:
  2157. #line 5188 "gram.y"
  2158. { yyval.str = "rename"; ;
  2159.     break;}
  2160. case 957:
  2161. #line 5189 "gram.y"
  2162. { yyval.str = "returns"; ;
  2163.     break;}
  2164. case 958:
  2165. #line 5190 "gram.y"
  2166. { yyval.str = "row"; ;
  2167.     break;}
  2168. case 959:
  2169. #line 5191 "gram.y"
  2170. { yyval.str = "rule"; ;
  2171.     break;}
  2172. case 960:
  2173. #line 5192 "gram.y"
  2174. { yyval.str = "scroll"; ;
  2175.     break;}
  2176. case 961:
  2177. #line 5193 "gram.y"
  2178. { yyval.str = "sequence"; ;
  2179.     break;}
  2180. case 962:
  2181. #line 5194 "gram.y"
  2182. { yyval.str = "serial"; ;
  2183.     break;}
  2184. case 963:
  2185. #line 5195 "gram.y"
  2186. { yyval.str = "serializable"; ;
  2187.     break;}
  2188. case 964:
  2189. #line 5196 "gram.y"
  2190. { yyval.str = "share"; ;
  2191.     break;}
  2192. case 965:
  2193. #line 5197 "gram.y"
  2194. { yyval.str = "start"; ;
  2195.     break;}
  2196. case 966:
  2197. #line 5198 "gram.y"
  2198. { yyval.str = "statement"; ;
  2199.     break;}
  2200. case 967:
  2201. #line 5199 "gram.y"
  2202. { yyval.str = "stdin"; ;
  2203.     break;}
  2204. case 968:
  2205. #line 5200 "gram.y"
  2206. { yyval.str = "stdout"; ;
  2207.     break;}
  2208. case 969:
  2209. #line 5201 "gram.y"
  2210. { yyval.str = "time"; ;
  2211.     break;}
  2212. case 970:
  2213. #line 5202 "gram.y"
  2214. { yyval.str = "timestamp"; ;
  2215.     break;}
  2216. case 971:
  2217. #line 5203 "gram.y"
  2218. { yyval.str = "timezone_hour"; ;
  2219.     break;}
  2220. case 972:
  2221. #line 5204 "gram.y"
  2222. { yyval.str = "timezone_minute"; ;
  2223.     break;}
  2224. case 973:
  2225. #line 5205 "gram.y"
  2226. { yyval.str = "trigger"; ;
  2227.     break;}
  2228. case 974:
  2229. #line 5206 "gram.y"
  2230. { yyval.str = "trusted"; ;
  2231.     break;}
  2232. case 975:
  2233. #line 5207 "gram.y"
  2234. { yyval.str = "type"; ;
  2235.     break;}
  2236. case 976:
  2237. #line 5208 "gram.y"
  2238. { yyval.str = "valid"; ;
  2239.     break;}
  2240. case 977:
  2241. #line 5209 "gram.y"
  2242. { yyval.str = "version"; ;
  2243.     break;}
  2244. case 978:
  2245. #line 5210 "gram.y"
  2246. { yyval.str = "zone"; ;
  2247.     break;}
  2248. case 979:
  2249. #line 5223 "gram.y"
  2250. { yyval.str = yyvsp[0].str; ;
  2251.     break;}
  2252. case 980:
  2253. #line 5224 "gram.y"
  2254. { yyval.str = "abort"; ;
  2255.     break;}
  2256. case 981:
  2257. #line 5225 "gram.y"
  2258. { yyval.str = "analyze"; ;
  2259.     break;}
  2260. case 982:
  2261. #line 5226 "gram.y"
  2262. { yyval.str = "binary"; ;
  2263.     break;}
  2264. case 983:
  2265. #line 5227 "gram.y"
  2266. { yyval.str = "case"; ;
  2267.     break;}
  2268. case 984:
  2269. #line 5228 "gram.y"
  2270. { yyval.str = "cluster"; ;
  2271.     break;}
  2272. case 985:
  2273. #line 5229 "gram.y"
  2274. { yyval.str = "coalesce"; ;
  2275.     break;}
  2276. case 986:
  2277. #line 5230 "gram.y"
  2278. { yyval.str = "constraint"; ;
  2279.     break;}
  2280. case 987:
  2281. #line 5231 "gram.y"
  2282. { yyval.str = "copy"; ;
  2283.     break;}
  2284. case 988:
  2285. #line 5232 "gram.y"
  2286. { yyval.str = "current"; ;
  2287.     break;}
  2288. case 989:
  2289. #line 5233 "gram.y"
  2290. { yyval.str = "do"; ;
  2291.     break;}
  2292. case 990:
  2293. #line 5234 "gram.y"
  2294. { yyval.str = "else"; ;
  2295.     break;}
  2296. case 991:
  2297. #line 5235 "gram.y"
  2298. { yyval.str = "end"; ;
  2299.     break;}
  2300. case 992:
  2301. #line 5236 "gram.y"
  2302. { yyval.str = "explain"; ;
  2303.     break;}
  2304. case 993:
  2305. #line 5237 "gram.y"
  2306. { yyval.str = "extend"; ;
  2307.     break;}
  2308. case 994:
  2309. #line 5238 "gram.y"
  2310. { yyval.str = "false"; ;
  2311.     break;}
  2312. case 995:
  2313. #line 5239 "gram.y"
  2314. { yyval.str = "foreign"; ;
  2315.     break;}
  2316. case 996:
  2317. #line 5240 "gram.y"
  2318. { yyval.str = "global"; ;
  2319.     break;}
  2320. case 997:
  2321. #line 5241 "gram.y"
  2322. { yyval.str = "group"; ;
  2323.     break;}
  2324. case 998:
  2325. #line 5242 "gram.y"
  2326. { yyval.str = "listen"; ;
  2327.     break;}
  2328. case 999:
  2329. #line 5243 "gram.y"
  2330. { yyval.str = "load"; ;
  2331.     break;}
  2332. case 1000:
  2333. #line 5244 "gram.y"
  2334. { yyval.str = "local"; ;
  2335.     break;}
  2336. case 1001:
  2337. #line 5245 "gram.y"
  2338. { yyval.str = "lock"; ;
  2339.     break;}
  2340. case 1002:
  2341. #line 5246 "gram.y"
  2342. { yyval.str = "move"; ;
  2343.     break;}
  2344. case 1003:
  2345. #line 5247 "gram.y"
  2346. { yyval.str = "new"; ;
  2347.     break;}
  2348. case 1004:
  2349. #line 5248 "gram.y"
  2350. { yyval.str = "none"; ;
  2351.     break;}
  2352. case 1005:
  2353. #line 5249 "gram.y"
  2354. { yyval.str = "nullif"; ;
  2355.     break;}
  2356. case 1006:
  2357. #line 5250 "gram.y"
  2358. { yyval.str = "order"; ;
  2359.     break;}
  2360. case 1007:
  2361. #line 5251 "gram.y"
  2362. { yyval.str = "position"; ;
  2363.     break;}
  2364. case 1008:
  2365. #line 5252 "gram.y"
  2366. { yyval.str = "precision"; ;
  2367.     break;}
  2368. case 1009:
  2369. #line 5253 "gram.y"
  2370. { yyval.str = "reset"; ;
  2371.     break;}
  2372. case 1010:
  2373. #line 5254 "gram.y"
  2374. { yyval.str = "setof"; ;
  2375.     break;}
  2376. case 1011:
  2377. #line 5255 "gram.y"
  2378. { yyval.str = "show"; ;
  2379.     break;}
  2380. case 1012:
  2381. #line 5256 "gram.y"
  2382. { yyval.str = "table"; ;
  2383.     break;}
  2384. case 1013:
  2385. #line 5257 "gram.y"
  2386. { yyval.str = "then"; ;
  2387.     break;}
  2388. case 1014:
  2389. #line 5258 "gram.y"
  2390. { yyval.str = "transaction"; ;
  2391.     break;}
  2392. case 1015:
  2393. #line 5259 "gram.y"
  2394. { yyval.str = "true"; ;
  2395.     break;}
  2396. case 1016:
  2397. #line 5260 "gram.y"
  2398. { yyval.str = "vacuum"; ;
  2399.     break;}
  2400. case 1017:
  2401. #line 5261 "gram.y"
  2402. { yyval.str = "verbose"; ;
  2403.     break;}
  2404. case 1018:
  2405. #line 5262 "gram.y"
  2406. { yyval.str = "when"; ;
  2407.     break;}
  2408. case 1019:
  2409. #line 5266 "gram.y"
  2410. {
  2411. if (QueryIsRule)
  2412. yyval.str = "*CURRENT*";
  2413. else
  2414. elog(ERROR,"CURRENT used in non-rule query");
  2415. ;
  2416.     break;}
  2417. case 1020:
  2418. #line 5273 "gram.y"
  2419. {
  2420. if (QueryIsRule)
  2421. yyval.str = "*NEW*";
  2422. else
  2423. elog(ERROR,"NEW used in non-rule query");
  2424. ;
  2425.     break;}
  2426. }
  2427.    /* the action file gets copied in in place of this dollarsign */
  2428. #line 543 "/usr/share/misc/bison.simple"
  2429.   yyvsp -= yylen;
  2430.   yyssp -= yylen;
  2431. #ifdef YYLSP_NEEDED
  2432.   yylsp -= yylen;
  2433. #endif
  2434. #if YYDEBUG != 0
  2435.   if (yydebug)
  2436.     {
  2437.       short *ssp1 = yyss - 1;
  2438.       fprintf (stderr, "state stack now");
  2439.       while (ssp1 != yyssp)
  2440. fprintf (stderr, " %d", *++ssp1);
  2441.       fprintf (stderr, "n");
  2442.     }
  2443. #endif
  2444.   *++yyvsp = yyval;
  2445. #ifdef YYLSP_NEEDED
  2446.   yylsp++;
  2447.   if (yylen == 0)
  2448.     {
  2449.       yylsp->first_line = yylloc.first_line;
  2450.       yylsp->first_column = yylloc.first_column;
  2451.       yylsp->last_line = (yylsp-1)->last_line;
  2452.       yylsp->last_column = (yylsp-1)->last_column;
  2453.       yylsp->text = 0;
  2454.     }
  2455.   else
  2456.     {
  2457.       yylsp->last_line = (yylsp+yylen-1)->last_line;
  2458.       yylsp->last_column = (yylsp+yylen-1)->last_column;
  2459.     }
  2460. #endif
  2461.   /* Now "shift" the result of the reduction.
  2462.      Determine what state that goes to,
  2463.      based on the state we popped back to
  2464.      and the rule number reduced by.  */
  2465.   yyn = yyr1[yyn];
  2466.   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
  2467.   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
  2468.     yystate = yytable[yystate];
  2469.   else
  2470.     yystate = yydefgoto[yyn - YYNTBASE];
  2471.   goto yynewstate;
  2472. yyerrlab:   /* here on detecting error */
  2473.   if (! yyerrstatus)
  2474.     /* If not already recovering from an error, report this error.  */
  2475.     {
  2476.       ++yynerrs;
  2477. #ifdef YYERROR_VERBOSE
  2478.       yyn = yypact[yystate];
  2479.       if (yyn > YYFLAG && yyn < YYLAST)
  2480. {
  2481.   int size = 0;
  2482.   char *msg;
  2483.   int x, count;
  2484.   count = 0;
  2485.   /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
  2486.   for (x = (yyn < 0 ? -yyn : 0);
  2487.        x < (sizeof(yytname) / sizeof(char *)); x++)
  2488.     if (yycheck[x + yyn] == x)
  2489.       size += strlen(yytname[x]) + 15, count++;
  2490.   msg = (char *) malloc(size + 15);
  2491.   if (msg != 0)
  2492.     {
  2493.       strcpy(msg, "parse error");
  2494.       if (count < 5)
  2495. {
  2496.   count = 0;
  2497.   for (x = (yyn < 0 ? -yyn : 0);
  2498.        x < (sizeof(yytname) / sizeof(char *)); x++)
  2499.     if (yycheck[x + yyn] == x)
  2500.       {
  2501. strcat(msg, count == 0 ? ", expecting `" : " or `");
  2502. strcat(msg, yytname[x]);
  2503. strcat(msg, "'");
  2504. count++;
  2505.       }
  2506. }
  2507.       yyerror(msg);
  2508.       free(msg);
  2509.     }
  2510.   else
  2511.     yyerror ("parse error; also virtual memory exceeded");
  2512. }
  2513.       else
  2514. #endif /* YYERROR_VERBOSE */
  2515. yyerror("parse error");
  2516.     }
  2517.   goto yyerrlab1;
  2518. yyerrlab1:   /* here on error raised explicitly by an action */
  2519.   if (yyerrstatus == 3)
  2520.     {
  2521.       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
  2522.       /* return failure if at end of input */
  2523.       if (yychar == YYEOF)
  2524. YYABORT;
  2525. #if YYDEBUG != 0
  2526.       if (yydebug)
  2527. fprintf(stderr, "Discarding token %d (%s).n", yychar, yytname[yychar1]);
  2528. #endif
  2529.       yychar = YYEMPTY;
  2530.     }
  2531.   /* Else will try to reuse lookahead token
  2532.      after shifting the error token.  */
  2533.   yyerrstatus = 3; /* Each real token shifted decrements this */
  2534.   goto yyerrhandle;
  2535. yyerrdefault:  /* current state does not do anything special for the error token. */
  2536. #if 0
  2537.   /* This is wrong; only states that explicitly want error tokens
  2538.      should shift them.  */
  2539.   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
  2540.   if (yyn) goto yydefault;
  2541. #endif
  2542. yyerrpop:   /* pop the current state because it cannot handle the error token */
  2543.   if (yyssp == yyss) YYABORT;
  2544.   yyvsp--;
  2545.   yystate = *--yyssp;
  2546. #ifdef YYLSP_NEEDED
  2547.   yylsp--;
  2548. #endif
  2549. #if YYDEBUG != 0
  2550.   if (yydebug)
  2551.     {
  2552.       short *ssp1 = yyss - 1;
  2553.       fprintf (stderr, "Error: state stack now");
  2554.       while (ssp1 != yyssp)
  2555. fprintf (stderr, " %d", *++ssp1);
  2556.       fprintf (stderr, "n");
  2557.     }
  2558. #endif
  2559. yyerrhandle:
  2560.   yyn = yypact[yystate];
  2561.   if (yyn == YYFLAG)
  2562.     goto yyerrdefault;
  2563.   yyn += YYTERROR;
  2564.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
  2565.     goto yyerrdefault;
  2566.   yyn = yytable[yyn];
  2567.   if (yyn < 0)
  2568.     {
  2569.       if (yyn == YYFLAG)
  2570. goto yyerrpop;
  2571.       yyn = -yyn;
  2572.       goto yyreduce;
  2573.     }
  2574.   else if (yyn == 0)
  2575.     goto yyerrpop;
  2576.   if (yyn == YYFINAL)
  2577.     YYACCEPT;
  2578. #if YYDEBUG != 0
  2579.   if (yydebug)
  2580.     fprintf(stderr, "Shifting error token, ");
  2581. #endif
  2582.   *++yyvsp = yylval;
  2583. #ifdef YYLSP_NEEDED
  2584.   *++yylsp = yylloc;
  2585. #endif
  2586.   yystate = yyn;
  2587.   goto yynewstate;
  2588.  yyacceptlab:
  2589.   /* YYACCEPT comes here.  */
  2590.   if (yyfree_stacks)
  2591.     {
  2592.       free (yyss);
  2593.       free (yyvs);
  2594. #ifdef YYLSP_NEEDED
  2595.       free (yyls);
  2596. #endif
  2597.     }
  2598.   return 0;
  2599.  yyabortlab:
  2600.   /* YYABORT comes here.  */
  2601.   if (yyfree_stacks)
  2602.     {
  2603.       free (yyss);
  2604.       free (yyvs);
  2605. #ifdef YYLSP_NEEDED
  2606.       free (yyls);
  2607. #endif
  2608.     }
  2609.   return 1;
  2610. }
  2611. #line 5281 "gram.y"
  2612. static Node *
  2613. makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr)
  2614. {
  2615. A_Expr *a = makeNode(A_Expr);
  2616. a->oper = oper;
  2617. a->opname = opname;
  2618. a->lexpr = lexpr;
  2619. a->rexpr = rexpr;
  2620. return (Node *)a;
  2621. }
  2622. /* makeRowExpr()
  2623.  * Generate separate operator nodes for a single row descriptor expression.
  2624.  * Perhaps this should go deeper in the parser someday...
  2625.  * - thomas 1997-12-22
  2626.  */
  2627. static Node *
  2628. makeRowExpr(char *opr, List *largs, List *rargs)
  2629. {
  2630. Node *expr = NULL;
  2631. Node *larg, *rarg;
  2632. if (length(largs) != length(rargs))
  2633. elog(ERROR,"Unequal number of entries in row expression");
  2634. if (lnext(largs) != NIL)
  2635. expr = makeRowExpr(opr,lnext(largs),lnext(rargs));
  2636. larg = lfirst(largs);
  2637. rarg = lfirst(rargs);
  2638. if ((strcmp(opr, "=") == 0)
  2639.  || (strcmp(opr, "<") == 0)
  2640.  || (strcmp(opr, "<=") == 0)
  2641.  || (strcmp(opr, ">") == 0)
  2642.  || (strcmp(opr, ">=") == 0))
  2643. {
  2644. if (expr == NULL)
  2645. expr = makeA_Expr(OP, opr, larg, rarg);
  2646. else
  2647. expr = makeA_Expr(AND, NULL, expr, makeA_Expr(OP, opr, larg, rarg));
  2648. }
  2649. else if (strcmp(opr, "<>") == 0)
  2650. {
  2651. if (expr == NULL)
  2652. expr = makeA_Expr(OP, opr, larg, rarg);
  2653. else
  2654. expr = makeA_Expr(OR, NULL, expr, makeA_Expr(OP, opr, larg, rarg));
  2655. }
  2656. else
  2657. {
  2658. elog(ERROR,"Operator '%s' not implemented for row expressions",opr);
  2659. }
  2660. return expr;
  2661. }
  2662. static void
  2663. mapTargetColumns(List *src, List *dst)
  2664. {
  2665. ColumnDef *s;
  2666. ResTarget *d;
  2667. if (length(src) != length(dst))
  2668. elog(ERROR,"CREATE TABLE/AS SELECT has mismatched column count");
  2669. while ((src != NIL) && (dst != NIL))
  2670. {
  2671. s = (ColumnDef *)lfirst(src);
  2672. d = (ResTarget *)lfirst(dst);
  2673. d->name = s->colname;
  2674. src = lnext(src);
  2675. dst = lnext(dst);
  2676. }
  2677. return;
  2678. } /* mapTargetColumns() */
  2679. static Node *makeIndexable(char *opname, Node *lexpr, Node *rexpr)
  2680. {
  2681. Node *result = NULL;
  2682. /* we do this so indexes can be used */
  2683. if (strcmp(opname,"~") == 0 ||
  2684. strcmp(opname,"~*") == 0)
  2685. {
  2686. if (nodeTag(rexpr) == T_A_Const &&
  2687.    ((A_Const *)rexpr)->val.type == T_String &&
  2688.    ((A_Const *)rexpr)->val.val.str[0] == '^')
  2689. {
  2690. A_Const *n = (A_Const *)rexpr;
  2691. char *match_least = palloc(strlen(n->val.val.str)+2);
  2692. char *match_most = palloc(strlen(n->val.val.str)+2);
  2693. int pos, match_pos=0;
  2694. bool found_special = false;
  2695. /* Cannot optimize if unquoted | { } is present in pattern */
  2696. for (pos = 1; n->val.val.str[pos]; pos++)
  2697. {
  2698. if (n->val.val.str[pos] == '|' ||
  2699.     n->val.val.str[pos] == '{' ||
  2700.     n->val.val.str[pos] == '}')
  2701. {
  2702. found_special = true;
  2703. break;
  2704. }
  2705.       if (n->val.val.str[pos] == '\')
  2706. {
  2707. pos++;
  2708. if (n->val.val.str[pos] == '')
  2709. break;
  2710. }
  2711. }
  2712. if (!found_special)
  2713. {
  2714. /* note start at pos 1 to skip leading ^ */
  2715. for (pos = 1; n->val.val.str[pos]; pos++)
  2716. {
  2717. if (n->val.val.str[pos] == '.' ||
  2718. n->val.val.str[pos] == '?' ||
  2719. n->val.val.str[pos] == '*' ||
  2720. n->val.val.str[pos] == '[' ||
  2721. n->val.val.str[pos] == '$' ||
  2722. (strcmp(opname,"~*") == 0 && isalpha(n->val.val.str[pos])))
  2723.       break;
  2724.       if (n->val.val.str[pos] == '\')
  2725. {
  2726. pos++;
  2727. if (n->val.val.str[pos] == '')
  2728. break;
  2729. }
  2730. match_least[match_pos] = n->val.val.str[pos];
  2731. match_most[match_pos++] = n->val.val.str[pos];
  2732. }
  2733. if (match_pos != 0)
  2734. {
  2735. A_Const *least = makeNode(A_Const);
  2736. A_Const *most = makeNode(A_Const);
  2737. /* make strings to be used in index use */
  2738. match_least[match_pos] = '';
  2739. match_most[match_pos] = '377';
  2740. match_most[match_pos+1] = '';
  2741. least->val.type = T_String;
  2742. least->val.val.str = match_least;
  2743. most->val.type = T_String;
  2744. most->val.val.str = match_most;
  2745. #ifdef USE_LOCALE
  2746. result = makeA_Expr(AND, NULL,
  2747. makeA_Expr(OP, "~", lexpr, rexpr),
  2748. makeA_Expr(OP, ">=", lexpr, (Node *)least));
  2749. #else
  2750. result = makeA_Expr(AND, NULL,
  2751. makeA_Expr(OP, "~", lexpr, rexpr),
  2752. makeA_Expr(AND, NULL,
  2753. makeA_Expr(OP, ">=", lexpr, (Node *)least),
  2754. makeA_Expr(OP, "<=", lexpr, (Node *)most)));
  2755. #endif
  2756. }
  2757. }
  2758. }
  2759. }
  2760. else if (strcmp(opname,"~~") == 0)
  2761. {
  2762. if (nodeTag(rexpr) == T_A_Const &&
  2763.    ((A_Const *)rexpr)->val.type == T_String)
  2764. {
  2765. A_Const *n = (A_Const *)rexpr;
  2766. char *match_least = palloc(strlen(n->val.val.str)+2);
  2767. char *match_most = palloc(strlen(n->val.val.str)+2);
  2768. int pos, match_pos=0;
  2769. for (pos = 0; n->val.val.str[pos]; pos++)
  2770. {
  2771. /* % and _ are wildcard characters in LIKE */
  2772. if (n->val.val.str[pos] == '%' ||
  2773. n->val.val.str[pos] == '_')
  2774. break;
  2775. /* Backslash quotes the next character */
  2776. if (n->val.val.str[pos] == '\')
  2777. {
  2778. pos++;
  2779. if (n->val.val.str[pos] == '')
  2780. break;
  2781. }
  2782. /*
  2783.  * NOTE: this code used to think that %% meant a literal %,
  2784.  * but textlike() itself does not think that, and the SQL92
  2785.  * spec doesn't say any such thing either.
  2786.  */
  2787. match_least[match_pos] = n->val.val.str[pos];
  2788. match_most[match_pos++] = n->val.val.str[pos];
  2789. }
  2790. if (match_pos != 0)
  2791. {
  2792. A_Const *least = makeNode(A_Const);
  2793. A_Const *most = makeNode(A_Const);
  2794. /* make strings to be used in index use */
  2795. match_least[match_pos] = '';
  2796. match_most[match_pos] = '377';
  2797. match_most[match_pos+1] = '';
  2798. least->val.type = T_String;
  2799. least->val.val.str = match_least;
  2800. most->val.type = T_String;
  2801. most->val.val.str = match_most;
  2802. #ifdef USE_LOCALE
  2803. result = makeA_Expr(AND, NULL,
  2804. makeA_Expr(OP, "~~", lexpr, rexpr),
  2805. makeA_Expr(OP, ">=", lexpr, (Node *)least));
  2806. #else
  2807. result = makeA_Expr(AND, NULL,
  2808. makeA_Expr(OP, "~~", lexpr, rexpr),
  2809. makeA_Expr(AND, NULL,
  2810. makeA_Expr(OP, ">=", lexpr, (Node *)least),
  2811. makeA_Expr(OP, "<=", lexpr, (Node *)most)));
  2812. #endif
  2813. }
  2814. }
  2815. }
  2816. if (result == NULL)
  2817. result = makeA_Expr(OP, opname, lexpr, rexpr);
  2818. return result;
  2819. } /* makeIndexable() */
  2820. /* xlateSqlFunc()
  2821.  * Convert alternate type names to internal Postgres types.
  2822.  * Do not convert "float", since that is handled elsewhere
  2823.  *  for FLOAT(p) syntax.
  2824.  */
  2825. static char *
  2826. xlateSqlFunc(char *name)
  2827. {
  2828. if (!strcasecmp(name,"character_length")
  2829.  || !strcasecmp(name,"char_length"))
  2830. return "length";
  2831. else
  2832. return name;
  2833. } /* xlateSqlFunc() */
  2834. /* xlateSqlType()
  2835.  * Convert alternate type names to internal Postgres types.
  2836.  */
  2837. static char *
  2838. xlateSqlType(char *name)
  2839. {
  2840. if (!strcasecmp(name,"int")
  2841.  || !strcasecmp(name,"integer"))
  2842. return "int4";
  2843. else if (!strcasecmp(name, "smallint"))
  2844. return "int2";
  2845. else if (!strcasecmp(name, "real")
  2846.  || !strcasecmp(name, "float"))
  2847. return "float8";
  2848. else if (!strcasecmp(name, "interval"))
  2849. return "timespan";
  2850. else if (!strcasecmp(name, "boolean"))
  2851. return "bool";
  2852. else
  2853. return name;
  2854. } /* xlateSqlType() */
  2855. void parser_init(Oid *typev, int nargs)
  2856. {
  2857. QueryIsRule = FALSE;
  2858. saved_relname[0]= '';
  2859. saved_In_Expr = NULL;
  2860. param_type_init(typev, nargs);
  2861. }
  2862. /* FlattenStringList()
  2863.  * Traverse list of string nodes and convert to a single string.
  2864.  * Used for reconstructing string form of complex expressions.
  2865.  *
  2866.  * Allocate at least one byte for terminator.
  2867.  */
  2868. static char *
  2869. FlattenStringList(List *list)
  2870. {
  2871. List *l;
  2872. Value *v;
  2873. char *s;
  2874. char *sp;
  2875. int nlist, len = 0;
  2876. nlist = length(list);
  2877. l = list;
  2878. while(l != NIL) {
  2879. v = (Value *)lfirst(l);
  2880. sp = v->val.str;
  2881. l = lnext(l);
  2882. len += strlen(sp);
  2883. };
  2884. len += nlist;
  2885. s = (char*) palloc(len+1);
  2886. *s = '';
  2887. l = list;
  2888. while(l != NIL) {
  2889. v = (Value *)lfirst(l);
  2890. sp = v->val.str;
  2891. l = lnext(l);
  2892. strcat(s,sp);
  2893. if (l != NIL) strcat(s," ");
  2894. };
  2895. *(s+len) = '';
  2896. return s;
  2897. } /* FlattenStringList() */
  2898. /* makeConstantList()
  2899.  * Convert constant value node into string node.
  2900.  */
  2901. static List *
  2902. makeConstantList( A_Const *n)
  2903. {
  2904. List *result = NIL;
  2905. char *typval = NULL;
  2906. char *defval = NULL;
  2907. if (nodeTag(n) != T_A_Const) {
  2908. elog(ERROR,"Cannot handle non-constant parameter");
  2909. } else if (n->val.type == T_Float) {
  2910. defval = (char*) palloc(20+1);
  2911. sprintf( defval, "%g", n->val.val.dval);
  2912. result = lcons( makeString(defval), NIL);
  2913. } else if (n->val.type == T_Integer) {
  2914. defval = (char*) palloc(20+1);
  2915. sprintf( defval, "%ld", n->val.val.ival);
  2916. result = lcons( makeString(defval), NIL);
  2917. } else if (n->val.type == T_String) {
  2918. defval = (char*) palloc(strlen( ((A_Const *) n)->val.val.str) + 3);
  2919. strcpy( defval, "'");
  2920. strcat( defval, ((A_Const *) n)->val.val.str);
  2921. strcat( defval, "'");
  2922. if (n->typename != NULL)
  2923. {
  2924. typval = (char*) palloc(strlen( n->typename->name) + 1);
  2925. strcpy(typval, n->typename->name);
  2926. result = lappend( lcons( makeString(typval), NIL), makeString(defval));
  2927. }
  2928. else
  2929. {
  2930. result = lcons( makeString(defval), NIL);
  2931. }
  2932. } else {
  2933. elog(ERROR,"Internal error in makeConstantList(): cannot encode node");
  2934. };
  2935. return result;
  2936. } /* makeConstantList() */
  2937. /* fmtId()
  2938.  * Check input string for non-lowercase/non-numeric characters.
  2939.  * Returns either input string or input surrounded by double quotes.
  2940.  */
  2941. static char *
  2942. fmtId(char *rawid)
  2943. {
  2944. static char *cp;
  2945. for (cp = rawid; *cp != ''; cp++)
  2946. if (! (islower(*cp) || isdigit(*cp) || (*cp == '_'))) break;
  2947. if (*cp != '') {
  2948. cp = palloc(strlen(rawid)+3);
  2949. strcpy(cp,""");
  2950. strcat(cp,rawid);
  2951. strcat(cp,""");
  2952. } else {
  2953. cp = rawid;
  2954. };
  2955. return cp;
  2956. }
  2957. /*
  2958.  * param_type_init()
  2959.  *
  2960.  * keep enough information around fill out the type of param nodes
  2961.  * used in postquel functions
  2962.  */
  2963. static void
  2964. param_type_init(Oid *typev, int nargs)
  2965. {
  2966. pfunc_num_args = nargs;
  2967. param_type_info = typev;
  2968. }
  2969. Oid param_type(int t)
  2970. {
  2971. if ((t > pfunc_num_args) || (t == 0))
  2972. return InvalidOid;
  2973. return param_type_info[t - 1];
  2974. }
  2975. /*
  2976.  * The optimizer doesn't like '-' 4 for index use.  It only checks for
  2977.  * Var '=' Const.  It wants an integer of -4, so we try to merge the
  2978.  * minus into the constant.
  2979.  */
  2980. static Node *doNegate(Node *n)
  2981. {
  2982. if (IsA(n, A_Const))
  2983. {
  2984. A_Const *con = (A_Const *)n;
  2985. if (con->val.type == T_Integer)
  2986. {
  2987. con->val.val.ival = -con->val.val.ival;
  2988. return n;
  2989. }
  2990. if (con->val.type == T_Float)
  2991. {
  2992. con->val.val.dval = -con->val.val.dval;
  2993. return n;
  2994. }
  2995. }
  2996. return makeA_Expr(OP, "-", NULL, n);
  2997. }