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

数据库系统

开发平台:

Unix_Linux

  1. /**********************************************************************
  2.  * pl_exec.c - Executor for the PL/pgSQL
  3.  *   procedural language
  4.  *
  5.  * IDENTIFICATION
  6.  *   $Header: /usr/local/cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.12 1999/07/04 01:03:01 tgl Exp $
  7.  *
  8.  *   This software is copyrighted by Jan Wieck - Hamburg.
  9.  *
  10.  *   The author hereby grants permission  to  use,  copy, modify,
  11.  *   distribute,  and license this software and its documentation
  12.  *   for any purpose, provided that existing copyright notices are
  13.  *   retained in all  copies  and  that this notice is included
  14.  *   verbatim in any distributions. No written agreement, license,
  15.  *   or  royalty  fee is required for any of the authorized uses.
  16.  *   Modifications to this software may be  copyrighted  by  their
  17.  *   author  and  need  not  follow  the licensing terms described
  18.  *   here, provided that the new terms are  clearly  indicated  on
  19.  *   the first page of each file where they apply.
  20.  *
  21.  *   IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTORS BE LIABLE TO ANY
  22.  *   PARTY  FOR  DIRECT, INDIRECT, SPECIAL,   INCIDENTAL,  OR
  23.  *   CONSEQUENTIAL   DAMAGES  ARISING OUT  OF  THE  USE  OF  THIS
  24.  *   SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN
  25.  *   IF  THE  AUTHOR  HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
  26.  *   DAMAGE.
  27.  *
  28.  *   THE  AUTHOR  AND DISTRIBUTORS  SPECIFICALLY  DISCLAIM ANY
  29.  *   WARRANTIES,  INCLUDING,  BUT NOT  LIMITED  TO,  THE IMPLIED
  30.  *   WARRANTIES  OF  MERCHANTABILITY, FITNESS  FOR  A  PARTICULAR
  31.  *   PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE IS PROVIDED ON
  32.  *   AN "AS IS" BASIS, AND THE AUTHOR AND  DISTRIBUTORS  HAVE  NO
  33.  *   OBLIGATION   TO PROVIDE   MAINTENANCE,  SUPPORT,  UPDATES,
  34.  *   ENHANCEMENTS, OR MODIFICATIONS.
  35.  *
  36.  **********************************************************************/
  37. #include <stdio.h>
  38. #include <stdlib.h>
  39. #include <stdarg.h>
  40. #include <unistd.h>
  41. #include <fcntl.h>
  42. #include <string.h>
  43. #include <ctype.h>
  44. #include <setjmp.h>
  45. #include "plpgsql.h"
  46. #include "pl.tab.h"
  47. #include "executor/spi.h"
  48. #include "executor/spi_priv.h"
  49. #include "commands/trigger.h"
  50. #include "utils/elog.h"
  51. #include "utils/builtins.h"
  52. #include "fmgr.h"
  53. #include "access/heapam.h"
  54. #include "tcop/tcopprot.h"
  55. #include "utils/syscache.h"
  56. #include "catalog/pg_proc.h"
  57. #include "catalog/pg_type.h"
  58. static PLpgSQL_function *error_info_func = NULL;
  59. static PLpgSQL_stmt *error_info_stmt = NULL;
  60. static char *error_info_text = NULL;
  61. /************************************************************
  62.  * Local function forward declarations
  63.  ************************************************************/
  64. static PLpgSQL_var *copy_var(PLpgSQL_var * var);
  65. static PLpgSQL_rec *copy_rec(PLpgSQL_rec * rec);
  66. static int exec_stmt_block(PLpgSQL_execstate * estate,
  67. PLpgSQL_stmt_block * block);
  68. static int exec_stmts(PLpgSQL_execstate * estate,
  69.    PLpgSQL_stmts * stmts);
  70. static int exec_stmt(PLpgSQL_execstate * estate,
  71.   PLpgSQL_stmt * stmt);
  72. static int exec_stmt_assign(PLpgSQL_execstate * estate,
  73.  PLpgSQL_stmt_assign * stmt);
  74. static int exec_stmt_if(PLpgSQL_execstate * estate,
  75.  PLpgSQL_stmt_if * stmt);
  76. static int exec_stmt_loop(PLpgSQL_execstate * estate,
  77.    PLpgSQL_stmt_loop * stmt);
  78. static int exec_stmt_while(PLpgSQL_execstate * estate,
  79. PLpgSQL_stmt_while * stmt);
  80. static int exec_stmt_fori(PLpgSQL_execstate * estate,
  81.    PLpgSQL_stmt_fori * stmt);
  82. static int exec_stmt_fors(PLpgSQL_execstate * estate,
  83.    PLpgSQL_stmt_fors * stmt);
  84. static int exec_stmt_select(PLpgSQL_execstate * estate,
  85.  PLpgSQL_stmt_select * stmt);
  86. static int exec_stmt_exit(PLpgSQL_execstate * estate,
  87.    PLpgSQL_stmt_exit * stmt);
  88. static int exec_stmt_return(PLpgSQL_execstate * estate,
  89.  PLpgSQL_stmt_return * stmt);
  90. static int exec_stmt_raise(PLpgSQL_execstate * estate,
  91. PLpgSQL_stmt_raise * stmt);
  92. static int exec_stmt_execsql(PLpgSQL_execstate * estate,
  93.   PLpgSQL_stmt_execsql * stmt);
  94. static void exec_prepare_plan(PLpgSQL_execstate * estate,
  95.   PLpgSQL_expr * expr);
  96. static bool exec_simple_check_node(Node *node);
  97. static void exec_simple_check_plan(PLpgSQL_expr * expr);
  98. static void exec_eval_clear_fcache(Node *node);
  99. static Datum exec_eval_simple_expr(PLpgSQL_execstate * estate,
  100.   PLpgSQL_expr * expr,
  101.   bool *isNull,
  102.   Oid *rettype);
  103. static void exec_assign_expr(PLpgSQL_execstate * estate,
  104.  PLpgSQL_datum * target,
  105.  PLpgSQL_expr * expr);
  106. static void exec_assign_value(PLpgSQL_execstate * estate,
  107.   PLpgSQL_datum * target,
  108.   Datum value, Oid valtype, bool *isNull);
  109. static Datum exec_eval_expr(PLpgSQL_execstate * estate,
  110.    PLpgSQL_expr * expr,
  111.    bool *isNull,
  112.    Oid *rettype);
  113. static int exec_run_select(PLpgSQL_execstate * estate,
  114. PLpgSQL_expr * expr, int maxtuples);
  115. static void exec_move_row(PLpgSQL_execstate * estate,
  116.   PLpgSQL_rec * rec,
  117.   PLpgSQL_row * row,
  118.   HeapTuple tup, TupleDesc tupdesc);
  119. static Datum exec_cast_value(Datum value, Oid valtype,
  120. Oid reqtype,
  121. FmgrInfo *reqinput,
  122. int16 reqtypmod,
  123. bool *isnull);
  124. static void exec_set_found(PLpgSQL_execstate * estate, bool state);
  125. /* ----------
  126.  * plpgsql_exec_function Called by the call handler for
  127.  * function execution.
  128.  * ----------
  129.  */
  130. Datum
  131. plpgsql_exec_function(PLpgSQL_function * func,
  132.   FmgrValues *args, bool *isNull)
  133. {
  134. PLpgSQL_execstate estate;
  135. int i;
  136. sigjmp_buf save_restart;
  137. PLpgSQL_function *save_efunc;
  138. PLpgSQL_stmt *save_estmt;
  139. char    *save_etext;
  140. /* ----------
  141.  * Setup debug error info and catch elog()
  142.  * ----------
  143.  */
  144. save_efunc = error_info_func;
  145. save_estmt = error_info_stmt;
  146. save_etext = error_info_text;
  147. error_info_func = func;
  148. error_info_stmt = NULL;
  149. error_info_text = "while initialization of execution state";
  150. memcpy(&save_restart, &Warn_restart, sizeof(save_restart));
  151. if (sigsetjmp(Warn_restart, 1) != 0)
  152. {
  153. memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
  154. /* ----------
  155.  * If we are the first of cascaded error catchings,
  156.  * print where this happened
  157.  * ----------
  158.  */
  159. if (error_info_func != NULL)
  160. {
  161. elog(DEBUG, "Last error occured while executing PL/pgSQL function %s",
  162.  error_info_func->fn_name);
  163. if (error_info_stmt != NULL)
  164. {
  165. char    *stmttype;
  166. switch (error_info_stmt->cmd_type)
  167. {
  168. case PLPGSQL_STMT_BLOCK:
  169. stmttype = "blocks variable initialization";
  170. break;
  171. case PLPGSQL_STMT_ASSIGN:
  172. stmttype = "assignment";
  173. break;
  174. case PLPGSQL_STMT_IF:
  175. stmttype = "if";
  176. break;
  177. case PLPGSQL_STMT_LOOP:
  178. stmttype = "loop";
  179. break;
  180. case PLPGSQL_STMT_WHILE:
  181. stmttype = "while";
  182. break;
  183. case PLPGSQL_STMT_FORI:
  184. stmttype = "for with integer loopvar";
  185. break;
  186. case PLPGSQL_STMT_FORS:
  187. stmttype = "for over select rows";
  188. break;
  189. case PLPGSQL_STMT_SELECT:
  190. stmttype = "select into variables";
  191. break;
  192. case PLPGSQL_STMT_EXIT:
  193. stmttype = "exit";
  194. break;
  195. case PLPGSQL_STMT_RETURN:
  196. stmttype = "return";
  197. break;
  198. case PLPGSQL_STMT_RAISE:
  199. stmttype = "raise";
  200. break;
  201. case PLPGSQL_STMT_EXECSQL:
  202. stmttype = "SQL statement";
  203. break;
  204. default:
  205. stmttype = "unknown";
  206. break;
  207. }
  208. elog(DEBUG, "line %d at %s", error_info_stmt->lineno,
  209.  stmttype);
  210. }
  211. else
  212. {
  213. if (error_info_text != NULL)
  214. elog(DEBUG, "%s", error_info_text);
  215. else
  216. elog(DEBUG, "no more error information available");
  217. }
  218. error_info_func = NULL;
  219. error_info_stmt = NULL;
  220. error_info_text = NULL;
  221. }
  222. siglongjmp(Warn_restart, 1);
  223. }
  224. /* ----------
  225.  * Setup the execution state
  226.  * ----------
  227.  */
  228. estate.retval = 0;
  229. estate.retisnull = false;
  230. estate.rettype = InvalidOid;
  231. estate.retistuple = func->fn_retistuple;
  232. estate.retisset = func->fn_retset;
  233. estate.exitlabel = NULL;
  234. estate.found_varno = func->found_varno;
  235. estate.ndatums = func->ndatums;
  236. estate.datums = palloc(sizeof(PLpgSQL_datum *) * estate.ndatums);
  237. /* ----------
  238.  * Make local execution copies of all the datums
  239.  * ----------
  240.  */
  241. for (i = 0; i < func->ndatums; i++)
  242. {
  243. switch (func->datums[i]->dtype)
  244. {
  245. case PLPGSQL_DTYPE_VAR:
  246. estate.datums[i] = (PLpgSQL_datum *)
  247. copy_var((PLpgSQL_var *) (func->datums[i]));
  248. break;
  249. case PLPGSQL_DTYPE_REC:
  250. estate.datums[i] = (PLpgSQL_datum *)
  251. copy_rec((PLpgSQL_rec *) (func->datums[i]));
  252. break;
  253. case PLPGSQL_DTYPE_ROW:
  254. case PLPGSQL_DTYPE_RECFIELD:
  255. estate.datums[i] = func->datums[i];
  256. break;
  257. default:
  258. elog(ERROR, "unknown dtype %d in plpgsql_exec_function()",
  259.  func->datums[i]->dtype);
  260. }
  261. }
  262. /* ----------
  263.  * Put the actual call argument values into the variables
  264.  * ----------
  265.  */
  266. error_info_text = "while putting call arguments to local variables";
  267. for (i = 0; i < func->fn_nargs; i++)
  268. {
  269. int n = func->fn_argvarnos[i];
  270. switch (estate.datums[n]->dtype)
  271. {
  272. case PLPGSQL_DTYPE_VAR:
  273. {
  274. PLpgSQL_var *var = (PLpgSQL_var *) estate.datums[n];
  275. var->value = (Datum) (args->data[i]);
  276. var->isnull = *isNull;
  277. var->shouldfree = false;
  278. }
  279. break;
  280. case PLPGSQL_DTYPE_ROW:
  281. {
  282. HeapTuple tup;
  283. TupleDesc tupdesc;
  284. PLpgSQL_row *row = (PLpgSQL_row *) estate.datums[n];
  285. tup = ((TupleTableSlot *) (args->data[i]))->val;
  286. tupdesc = ((TupleTableSlot *) (args->data[i]))->ttc_tupleDescriptor;
  287. exec_move_row(&estate, NULL, row, tup, tupdesc);
  288. }
  289. break;
  290. default:
  291. elog(ERROR, "unknown dtype %d in plpgsql_exec_function()",
  292.  func->datums[i]->dtype);
  293. }
  294. }
  295. /* ----------
  296.  * Initialize the other variables to NULL values for now.
  297.  * The default values are set when the blocks are entered.
  298.  * ----------
  299.  */
  300. error_info_text = "while initializing local variables to NULL";
  301. for (i = estate.found_varno; i < estate.ndatums; i++)
  302. {
  303. switch (estate.datums[i]->dtype)
  304. {
  305. case PLPGSQL_DTYPE_VAR:
  306. {
  307. PLpgSQL_var *var = (PLpgSQL_var *) estate.datums[i];
  308. var->value = 0;
  309. var->isnull = true;
  310. var->shouldfree = false;
  311. }
  312. break;
  313. case PLPGSQL_DTYPE_ROW:
  314. case PLPGSQL_DTYPE_REC:
  315. case PLPGSQL_DTYPE_RECFIELD:
  316. break;
  317. default:
  318. elog(ERROR, "unknown dtype %d in plpgsql_exec_function()",
  319.  func->datums[i]->dtype);
  320. }
  321. }
  322. /* ----------
  323.  * Set the magic variable FOUND to false
  324.  * ----------
  325.  */
  326. exec_set_found(&estate, false);
  327. /* ----------
  328.  * Now call the toplevel block of statements
  329.  * ----------
  330.  */
  331. error_info_text = NULL;
  332. error_info_stmt = (PLpgSQL_stmt *) (func->action);
  333. if (exec_stmt_block(&estate, func->action) != PLPGSQL_RC_RETURN)
  334. {
  335. error_info_stmt = NULL;
  336. error_info_text = "at END of toplevel PL block";
  337. elog(ERROR, "control reaches end of function without RETURN");
  338. }
  339. /* ----------
  340.  * We got a return value - process it
  341.  * ----------
  342.  */
  343. error_info_stmt = NULL;
  344. error_info_text = "while casting return value to functions return type";
  345. *isNull = estate.retisnull;
  346. if (!estate.retistuple)
  347. {
  348. estate.retval = exec_cast_value(estate.retval, estate.rettype,
  349.   func->fn_rettype, &(func->fn_retinput), -1,
  350. isNull);
  351. /* ----------
  352.  * If the functions return type isn't by value,
  353.  * copy the value into upper executor memory context.
  354.  * ----------
  355.  */
  356. if (!*isNull && !func->fn_retbyval)
  357. {
  358. int len;
  359. Datum tmp;
  360. if (func->fn_rettyplen < 0)
  361. len = VARSIZE(estate.retval);
  362. else
  363. len = func->fn_rettyplen;
  364. tmp = (Datum) SPI_palloc(len);
  365. memcpy((void *) tmp, (void *) estate.retval, len);
  366. estate.retval = tmp;
  367. }
  368. }
  369. /* ----------
  370.  * Restore the previous error info and elog() jump target
  371.  * ----------
  372.  */
  373. error_info_func = save_efunc;
  374. error_info_stmt = save_estmt;
  375. error_info_text = save_etext;
  376. memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
  377. /* ----------
  378.  * Return the functions result
  379.  * ----------
  380.  */
  381. return estate.retval;
  382. }
  383. /* ----------
  384.  * plpgsql_exec_trigger Called by the call handler for
  385.  * trigger execution.
  386.  * ----------
  387.  */
  388. HeapTuple
  389. plpgsql_exec_trigger(PLpgSQL_function * func,
  390.  TriggerData *trigdata)
  391. {
  392. PLpgSQL_execstate estate;
  393. int i;
  394. sigjmp_buf save_restart;
  395. PLpgSQL_function *save_efunc;
  396. PLpgSQL_stmt *save_estmt;
  397. char    *save_etext;
  398. PLpgSQL_rec *rec_new;
  399. PLpgSQL_rec *rec_old;
  400. PLpgSQL_var *var;
  401. HeapTuple rettup;
  402. /* ----------
  403.  * Setup debug error info and catch elog()
  404.  * ----------
  405.  */
  406. save_efunc = error_info_func;
  407. save_estmt = error_info_stmt;
  408. save_etext = error_info_text;
  409. error_info_func = func;
  410. error_info_stmt = NULL;
  411. error_info_text = "while initialization of execution state";
  412. memcpy(&save_restart, &Warn_restart, sizeof(save_restart));
  413. if (sigsetjmp(Warn_restart, 1) != 0)
  414. {
  415. memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
  416. /* ----------
  417.  * If we are the first of cascaded error catchings,
  418.  * print where this happened
  419.  * ----------
  420.  */
  421. if (error_info_func != NULL)
  422. {
  423. elog(DEBUG, "Last error occured while executing PL/pgSQL function %s",
  424.  error_info_func->fn_name);
  425. if (error_info_stmt != NULL)
  426. {
  427. char    *stmttype;
  428. switch (error_info_stmt->cmd_type)
  429. {
  430. case PLPGSQL_STMT_BLOCK:
  431. stmttype = "blocks variable initialization";
  432. break;
  433. case PLPGSQL_STMT_ASSIGN:
  434. stmttype = "assignment";
  435. break;
  436. case PLPGSQL_STMT_IF:
  437. stmttype = "if";
  438. break;
  439. case PLPGSQL_STMT_LOOP:
  440. stmttype = "loop";
  441. break;
  442. case PLPGSQL_STMT_WHILE:
  443. stmttype = "while";
  444. break;
  445. case PLPGSQL_STMT_FORI:
  446. stmttype = "for with integer loopvar";
  447. break;
  448. case PLPGSQL_STMT_FORS:
  449. stmttype = "for over select rows";
  450. break;
  451. case PLPGSQL_STMT_SELECT:
  452. stmttype = "select into variables";
  453. break;
  454. case PLPGSQL_STMT_EXIT:
  455. stmttype = "exit";
  456. break;
  457. case PLPGSQL_STMT_RETURN:
  458. stmttype = "return";
  459. break;
  460. case PLPGSQL_STMT_RAISE:
  461. stmttype = "raise";
  462. break;
  463. case PLPGSQL_STMT_EXECSQL:
  464. stmttype = "SQL statement";
  465. break;
  466. default:
  467. stmttype = "unknown";
  468. break;
  469. }
  470. elog(DEBUG, "line %d at %s", error_info_stmt->lineno,
  471.  stmttype);
  472. }
  473. else
  474. {
  475. if (error_info_text != NULL)
  476. elog(DEBUG, "%s", error_info_text);
  477. else
  478. elog(DEBUG, "no more error information available");
  479. }
  480. error_info_func = NULL;
  481. error_info_stmt = NULL;
  482. error_info_text = NULL;
  483. }
  484. siglongjmp(Warn_restart, 1);
  485. }
  486. /* ----------
  487.  * Setup the execution state
  488.  * ----------
  489.  */
  490. estate.retval = 0;
  491. estate.retisnull = false;
  492. estate.rettype = InvalidOid;
  493. estate.retistuple = func->fn_retistuple;
  494. estate.retisset = func->fn_retset;
  495. estate.exitlabel = NULL;
  496. estate.found_varno = func->found_varno;
  497. estate.ndatums = func->ndatums;
  498. estate.datums = palloc(sizeof(PLpgSQL_datum *) * estate.ndatums);
  499. /* ----------
  500.  * Make local execution copies of all the datums
  501.  * ----------
  502.  */
  503. for (i = 0; i < func->ndatums; i++)
  504. {
  505. switch (func->datums[i]->dtype)
  506. {
  507. case PLPGSQL_DTYPE_VAR:
  508. estate.datums[i] = (PLpgSQL_datum *)
  509. copy_var((PLpgSQL_var *) (func->datums[i]));
  510. break;
  511. case PLPGSQL_DTYPE_REC:
  512. estate.datums[i] = (PLpgSQL_datum *)
  513. copy_rec((PLpgSQL_rec *) (func->datums[i]));
  514. break;
  515. case PLPGSQL_DTYPE_ROW:
  516. case PLPGSQL_DTYPE_RECFIELD:
  517. case PLPGSQL_DTYPE_TRIGARG:
  518. estate.datums[i] = func->datums[i];
  519. break;
  520. default:
  521. elog(ERROR, "unknown dtype %d in plpgsql_exec_function()",
  522.  func->datums[i]->dtype);
  523. }
  524. }
  525. /* ----------
  526.  * Put the trig and new tuples into the records
  527.  * and set the tg_op variable
  528.  * ----------
  529.  */
  530. rec_new = (PLpgSQL_rec *) (estate.datums[func->new_varno]);
  531. rec_old = (PLpgSQL_rec *) (estate.datums[func->old_varno]);
  532. var = (PLpgSQL_var *) (estate.datums[func->tg_op_varno]);
  533. var->isnull = false;
  534. if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
  535. {
  536. rec_new->tup = trigdata->tg_trigtuple;
  537. rec_new->tupdesc = trigdata->tg_relation->rd_att;
  538. rec_old->tup = NULL;
  539. rec_old->tupdesc = NULL;
  540. var->value = (Datum) textin("INSERT");
  541. }
  542. else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
  543. {
  544. rec_new->tup = trigdata->tg_newtuple;
  545. rec_new->tupdesc = trigdata->tg_relation->rd_att;
  546. rec_old->tup = trigdata->tg_trigtuple;
  547. rec_old->tupdesc = trigdata->tg_relation->rd_att;
  548. var->value = (Datum) textin("UPDATE");
  549. }
  550. else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
  551. {
  552. rec_new->tup = NULL;
  553. rec_new->tupdesc = NULL;
  554. rec_old->tup = trigdata->tg_trigtuple;
  555. rec_old->tupdesc = trigdata->tg_relation->rd_att;
  556. var->value = (Datum) textin("DELETE");
  557. }
  558. else
  559. {
  560. rec_new->tup = NULL;
  561. rec_new->tupdesc = NULL;
  562. var->value = (Datum) textin("UNKNOWN");
  563. }
  564. /* ----------
  565.  * Fill all the other special tg_ variables
  566.  * ----------
  567.  */
  568. var = (PLpgSQL_var *) (estate.datums[func->tg_name_varno]);
  569. var->isnull = false;
  570. var->value = (Datum) namein(trigdata->tg_trigger->tgname);
  571. var = (PLpgSQL_var *) (estate.datums[func->tg_when_varno]);
  572. var->isnull = false;
  573. if (TRIGGER_FIRED_BEFORE(trigdata->tg_event))
  574. var->value = (Datum) textin("BEFORE");
  575. else if (TRIGGER_FIRED_AFTER(trigdata->tg_event))
  576. var->value = (Datum) textin("AFTER");
  577. else
  578. var->value = (Datum) textin("UNKNOWN");
  579. var = (PLpgSQL_var *) (estate.datums[func->tg_level_varno]);
  580. var->isnull = false;
  581. if (TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))
  582. var->value = (Datum) textin("ROW");
  583. else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event))
  584. var->value = (Datum) textin("STATEMENT");
  585. else
  586. var->value = (Datum) textin("UNKNOWN");
  587. var = (PLpgSQL_var *) (estate.datums[func->tg_relid_varno]);
  588. var->isnull = false;
  589. var->value = (Datum) (trigdata->tg_relation->rd_id);
  590. var = (PLpgSQL_var *) (estate.datums[func->tg_relname_varno]);
  591. var->isnull = false;
  592. var->value = (Datum) namein(nameout(&(trigdata->tg_relation->rd_rel->relname)));
  593. var = (PLpgSQL_var *) (estate.datums[func->tg_nargs_varno]);
  594. var->isnull = false;
  595. var->value = (Datum) (trigdata->tg_trigger->tgnargs);
  596. /* ----------
  597.  * Put the actual call argument values into the special
  598.  * execution state variables
  599.  * ----------
  600.  */
  601. error_info_text = "while putting call arguments to local variables";
  602. estate.trig_nargs = trigdata->tg_trigger->tgnargs;
  603. if (estate.trig_nargs == 0)
  604. estate.trig_argv = NULL;
  605. else
  606. {
  607. estate.trig_argv = palloc(sizeof(Datum) * estate.trig_nargs);
  608. for (i = 0; i < trigdata->tg_trigger->tgnargs; i++)
  609. estate.trig_argv[i] = (Datum) textin(trigdata->tg_trigger->tgargs[i]);
  610. }
  611. /* ----------
  612.  * Initialize the other variables to NULL values for now.
  613.  * The default values are set when the blocks are entered.
  614.  * ----------
  615.  */
  616. error_info_text = "while initializing local variables to NULL";
  617. for (i = estate.found_varno; i < estate.ndatums; i++)
  618. {
  619. switch (estate.datums[i]->dtype)
  620. {
  621. case PLPGSQL_DTYPE_VAR:
  622. {
  623. PLpgSQL_var *var = (PLpgSQL_var *) estate.datums[i];
  624. var->value = 0;
  625. var->isnull = true;
  626. var->shouldfree = false;
  627. }
  628. break;
  629. case PLPGSQL_DTYPE_ROW:
  630. case PLPGSQL_DTYPE_REC:
  631. case PLPGSQL_DTYPE_RECFIELD:
  632. case PLPGSQL_DTYPE_TRIGARG:
  633. break;
  634. default:
  635. elog(ERROR, "unknown dtype %d in plpgsql_exec_trigger()",
  636.  func->datums[i]->dtype);
  637. }
  638. }
  639. /* ----------
  640.  * Set the magic variable FOUND to false
  641.  * ----------
  642.  */
  643. exec_set_found(&estate, false);
  644. /* ----------
  645.  * Now call the toplevel block of statements
  646.  * ----------
  647.  */
  648. error_info_text = NULL;
  649. error_info_stmt = (PLpgSQL_stmt *) (func->action);
  650. if (exec_stmt_block(&estate, func->action) != PLPGSQL_RC_RETURN)
  651. {
  652. error_info_stmt = NULL;
  653. error_info_text = "at END of toplevel PL block";
  654. elog(ERROR, "control reaches end of trigger procedure without RETURN");
  655. }
  656. /* ----------
  657.  * Check that the returned tuple structure has the same attributes,
  658.  * the relation that fired the trigger has.
  659.  *
  660.  * XXX This way it is possible, that the trigger returns a tuple
  661.  *    where attributes don't have the correct atttypmod's length.
  662.  *    It's up to the trigger's programmer to ensure that this
  663.  *    doesn't happen. Jan
  664.  * ----------
  665.  */
  666. if (estate.retisnull)
  667. rettup = NULL;
  668. else
  669. {
  670. TupleDesc td1 = trigdata->tg_relation->rd_att;
  671. TupleDesc td2 = estate.rettupdesc;
  672. int i;
  673. if (td1->natts != td2->natts)
  674. elog(ERROR, "returned tuple structure doesn't match table of trigger event");
  675. for (i = 1; i <= td1->natts; i++)
  676. {
  677. if (SPI_gettypeid(td1, i) != SPI_gettypeid(td2, i))
  678. elog(ERROR, "returned tuple structure doesn't match table of trigger event");
  679. }
  680. rettup = SPI_copytuple((HeapTuple) (estate.retval));
  681. }
  682. /* ----------
  683.  * Restore the previous error info and elog() jump target
  684.  * ----------
  685.  */
  686. error_info_func = save_efunc;
  687. error_info_stmt = save_estmt;
  688. error_info_text = save_etext;
  689. memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
  690. /* ----------
  691.  * Return the triggers result
  692.  * ----------
  693.  */
  694. return rettup;
  695. }
  696. /* ----------
  697.  * Support functions for copying local execution variables
  698.  * ----------
  699.  */
  700. static PLpgSQL_var *
  701. copy_var(PLpgSQL_var * var)
  702. {
  703. PLpgSQL_var *new = palloc(sizeof(PLpgSQL_var));
  704. memcpy(new, var, sizeof(PLpgSQL_var));
  705. return new;
  706. }
  707. static PLpgSQL_rec *
  708. copy_rec(PLpgSQL_rec * rec)
  709. {
  710. PLpgSQL_rec *new = palloc(sizeof(PLpgSQL_rec));
  711. memcpy(new, rec, sizeof(PLpgSQL_rec));
  712. return new;
  713. }
  714. /* ----------
  715.  * exec_stmt_block Execute a block of statements
  716.  * ----------
  717.  */
  718. static int
  719. exec_stmt_block(PLpgSQL_execstate * estate, PLpgSQL_stmt_block * block)
  720. {
  721. int rc;
  722. int i;
  723. int n;
  724. /* ----------
  725.  * First initialize all variables declared in this block
  726.  * ----------
  727.  */
  728. for (i = 0; i < block->n_initvars; i++)
  729. {
  730. n = block->initvarnos[i];
  731. switch (estate->datums[n]->dtype)
  732. {
  733. case PLPGSQL_DTYPE_VAR:
  734. {
  735. PLpgSQL_var *var = (PLpgSQL_var *) (estate->datums[n]);
  736. if (!var->isconst || var->isnull)
  737. {
  738. if (var->default_val == NULL)
  739. {
  740. var->value = (Datum) 0;
  741. var->isnull = true;
  742. if (var->notnull)
  743. elog(ERROR, "variable '%s' declared NOT NULL cannot default to NULL", var->refname);
  744. }
  745. else
  746. {
  747. exec_assign_expr(estate, (PLpgSQL_datum *) var,
  748.  var->default_val);
  749. }
  750. }
  751. }
  752. break;
  753. case PLPGSQL_DTYPE_REC:
  754. {
  755. PLpgSQL_rec *rec = (PLpgSQL_rec *) (estate->datums[n]);
  756. rec->tup = NULL;
  757. rec->tupdesc = NULL;
  758. }
  759. break;
  760. case PLPGSQL_DTYPE_RECFIELD:
  761. break;
  762. default:
  763. elog(ERROR, "unknown dtype %d in exec_stmt_block()", estate->datums[n]->dtype);
  764. }
  765. }
  766. /* ----------
  767.  * Execute the statements in the block's body
  768.  * ----------
  769.  */
  770. rc = exec_stmts(estate, block->body);
  771. /* ----------
  772.  * Handle the return code.
  773.  * ----------
  774.  */
  775. switch (rc)
  776. {
  777. case PLPGSQL_RC_OK:
  778. return PLPGSQL_RC_OK;
  779. case PLPGSQL_RC_EXIT:
  780. if (estate->exitlabel == NULL)
  781. return PLPGSQL_RC_OK;
  782. if (block->label == NULL)
  783. return PLPGSQL_RC_EXIT;
  784. if (strcmp(block->label, estate->exitlabel))
  785. return PLPGSQL_RC_EXIT;
  786. estate->exitlabel = NULL;
  787. return PLPGSQL_RC_OK;
  788. case PLPGSQL_RC_RETURN:
  789. return PLPGSQL_RC_RETURN;
  790. default:
  791. elog(ERROR, "unknown rc %d from exec_stmt()", rc);
  792. }
  793. return PLPGSQL_RC_OK;
  794. }
  795. /* ----------
  796.  * exec_stmts Iterate over a list of statements
  797.  * as long as their return code is OK
  798.  * ----------
  799.  */
  800. static int
  801. exec_stmts(PLpgSQL_execstate * estate, PLpgSQL_stmts * stmts)
  802. {
  803. int rc;
  804. int i;
  805. for (i = 0; i < stmts->stmts_used; i++)
  806. {
  807. rc = exec_stmt(estate, (PLpgSQL_stmt *) (stmts->stmts[i]));
  808. if (rc != PLPGSQL_RC_OK)
  809. return rc;
  810. }
  811. return PLPGSQL_RC_OK;
  812. }
  813. /* ----------
  814.  * exec_stmt Distribute one statement to the statements
  815.  * type specific execution function.
  816.  * ----------
  817.  */
  818. static int
  819. exec_stmt(PLpgSQL_execstate * estate, PLpgSQL_stmt * stmt)
  820. {
  821. PLpgSQL_stmt *save_estmt;
  822. int rc = -1;
  823. save_estmt = error_info_stmt;
  824. error_info_stmt = stmt;
  825. switch (stmt->cmd_type)
  826. {
  827. case PLPGSQL_STMT_BLOCK:
  828. rc = exec_stmt_block(estate, (PLpgSQL_stmt_block *) stmt);
  829. break;
  830. case PLPGSQL_STMT_ASSIGN:
  831. rc = exec_stmt_assign(estate, (PLpgSQL_stmt_assign *) stmt);
  832. break;
  833. case PLPGSQL_STMT_IF:
  834. rc = exec_stmt_if(estate, (PLpgSQL_stmt_if *) stmt);
  835. break;
  836. case PLPGSQL_STMT_LOOP:
  837. rc = exec_stmt_loop(estate, (PLpgSQL_stmt_loop *) stmt);
  838. break;
  839. case PLPGSQL_STMT_WHILE:
  840. rc = exec_stmt_while(estate, (PLpgSQL_stmt_while *) stmt);
  841. break;
  842. case PLPGSQL_STMT_FORI:
  843. rc = exec_stmt_fori(estate, (PLpgSQL_stmt_fori *) stmt);
  844. break;
  845. case PLPGSQL_STMT_FORS:
  846. rc = exec_stmt_fors(estate, (PLpgSQL_stmt_fors *) stmt);
  847. break;
  848. case PLPGSQL_STMT_SELECT:
  849. rc = exec_stmt_select(estate, (PLpgSQL_stmt_select *) stmt);
  850. break;
  851. case PLPGSQL_STMT_EXIT:
  852. rc = exec_stmt_exit(estate, (PLpgSQL_stmt_exit *) stmt);
  853. break;
  854. case PLPGSQL_STMT_RETURN:
  855. rc = exec_stmt_return(estate, (PLpgSQL_stmt_return *) stmt);
  856. break;
  857. case PLPGSQL_STMT_RAISE:
  858. rc = exec_stmt_raise(estate, (PLpgSQL_stmt_raise *) stmt);
  859. break;
  860. case PLPGSQL_STMT_EXECSQL:
  861. rc = exec_stmt_execsql(estate, (PLpgSQL_stmt_execsql *) stmt);
  862. break;
  863. default:
  864. error_info_stmt = save_estmt;
  865. elog(ERROR, "unknown cmdtype %d in exec_stmt",
  866.  stmt->cmd_type);
  867. }
  868. error_info_stmt = save_estmt;
  869. return rc;
  870. }
  871. /* ----------
  872.  * exec_stmt_assign Evaluate an expression and
  873.  * put the result into a variable.
  874.  * ----------
  875.  */
  876. static int
  877. exec_stmt_assign(PLpgSQL_execstate * estate, PLpgSQL_stmt_assign * stmt)
  878. {
  879. if (stmt->varno < 0)
  880. exec_assign_expr(estate, NULL, stmt->expr);
  881. else
  882. exec_assign_expr(estate, estate->datums[stmt->varno], stmt->expr);
  883. return PLPGSQL_RC_OK;
  884. }
  885. /* ----------
  886.  * exec_stmt_if Evaluate a bool expression and
  887.  * execute the true or false body
  888.  * conditionally.
  889.  * ----------
  890.  */
  891. static int
  892. exec_stmt_if(PLpgSQL_execstate * estate, PLpgSQL_stmt_if * stmt)
  893. {
  894. Datum value;
  895. Oid valtype;
  896. bool isnull = false;
  897. value = exec_eval_expr(estate, stmt->cond, &isnull, &valtype);
  898. if (value)
  899. {
  900. if (stmt->true_body != NULL)
  901. return exec_stmts(estate, stmt->true_body);
  902. }
  903. else
  904. {
  905. if (stmt->false_body != NULL)
  906. return exec_stmts(estate, stmt->false_body);
  907. }
  908. return PLPGSQL_RC_OK;
  909. }
  910. /* ----------
  911.  * exec_stmt_loop Loop over statements until
  912.  * an exit occurs.
  913.  * ----------
  914.  */
  915. static int
  916. exec_stmt_loop(PLpgSQL_execstate * estate, PLpgSQL_stmt_loop * stmt)
  917. {
  918. int rc;
  919. for (;;)
  920. {
  921. rc = exec_stmts(estate, stmt->body);
  922. switch (rc)
  923. {
  924. case PLPGSQL_RC_OK:
  925. break;
  926. case PLPGSQL_RC_EXIT:
  927. if (estate->exitlabel == NULL)
  928. return PLPGSQL_RC_OK;
  929. if (stmt->label == NULL)
  930. return PLPGSQL_RC_EXIT;
  931. if (strcmp(stmt->label, estate->exitlabel))
  932. return PLPGSQL_RC_EXIT;
  933. estate->exitlabel = NULL;
  934. return PLPGSQL_RC_OK;
  935. case PLPGSQL_RC_RETURN:
  936. return PLPGSQL_RC_RETURN;
  937. default:
  938. elog(ERROR, "unknown rc %d from exec_stmts()", rc);
  939. }
  940. }
  941. return PLPGSQL_RC_OK;
  942. }
  943. /* ----------
  944.  * exec_stmt_while Loop over statements as long
  945.  * as an expression evaluates to
  946.  * true or an exit occurs.
  947.  * ----------
  948.  */
  949. static int
  950. exec_stmt_while(PLpgSQL_execstate * estate, PLpgSQL_stmt_while * stmt)
  951. {
  952. Datum value;
  953. Oid valtype;
  954. bool isnull = false;
  955. int rc;
  956. for (;;)
  957. {
  958. value = exec_eval_expr(estate, stmt->cond, &isnull, &valtype);
  959. if (!value)
  960. break;
  961. rc = exec_stmts(estate, stmt->body);
  962. switch (rc)
  963. {
  964. case PLPGSQL_RC_OK:
  965. break;
  966. case PLPGSQL_RC_EXIT:
  967. if (estate->exitlabel == NULL)
  968. return PLPGSQL_RC_OK;
  969. if (stmt->label == NULL)
  970. return PLPGSQL_RC_EXIT;
  971. if (strcmp(stmt->label, estate->exitlabel))
  972. return PLPGSQL_RC_EXIT;
  973. estate->exitlabel = NULL;
  974. return PLPGSQL_RC_OK;
  975. case PLPGSQL_RC_RETURN:
  976. return PLPGSQL_RC_RETURN;
  977. default:
  978. elog(ERROR, "unknown rc %d from exec_stmts()", rc);
  979. }
  980. }
  981. return PLPGSQL_RC_OK;
  982. }
  983. /* ----------
  984.  * exec_stmt_fori Iterate an integer variable
  985.  * from a lower to an upper value.
  986.  * Loop can be left with exit.
  987.  * ----------
  988.  */
  989. static int
  990. exec_stmt_fori(PLpgSQL_execstate * estate, PLpgSQL_stmt_fori * stmt)
  991. {
  992. PLpgSQL_var *var;
  993. Datum value;
  994. Oid valtype;
  995. bool isnull = false;
  996. int rc;
  997. /* ----------
  998.  * Get the value of the lower bound into the loop var
  999.  * ----------
  1000.  */
  1001. value = exec_eval_expr(estate, stmt->lower, &isnull, &valtype);
  1002. var = (PLpgSQL_var *) (estate->datums[stmt->var->varno]);
  1003. value = exec_cast_value(value, valtype, var->datatype->typoid,
  1004. &(var->datatype->typinput),
  1005. var->datatype->atttypmod, &isnull);
  1006. if (isnull)
  1007. elog(ERROR, "lower bound of FOR loop cannot be NULL");
  1008. var->value = value;
  1009. var->isnull = false;
  1010. /* ----------
  1011.  * Get the value of the upper bound
  1012.  * ----------
  1013.  */
  1014. value = exec_eval_expr(estate, stmt->upper, &isnull, &valtype);
  1015. value = exec_cast_value(value, valtype, var->datatype->typoid,
  1016. &(var->datatype->typinput),
  1017. var->datatype->atttypmod, &isnull);
  1018. if (isnull)
  1019. elog(ERROR, "upper bound of FOR loop cannot be NULL");
  1020. /* ----------
  1021.  * Now do the loop
  1022.  * ----------
  1023.  */
  1024. exec_set_found(estate, false);
  1025. for (;;)
  1026. {
  1027. /* ----------
  1028.  * Check bounds
  1029.  * ----------
  1030.  */
  1031. if (stmt->reverse)
  1032. {
  1033. if ((int4) (var->value) < (int4) value)
  1034. break;
  1035. }
  1036. else
  1037. {
  1038. if ((int4) (var->value) > (int4) value)
  1039. break;
  1040. }
  1041. exec_set_found(estate, true);
  1042. /* ----------
  1043.  * Execute the statements
  1044.  * ----------
  1045.  */
  1046. rc = exec_stmts(estate, stmt->body);
  1047. /* ----------
  1048.  * Check returncode
  1049.  * ----------
  1050.  */
  1051. switch (rc)
  1052. {
  1053. case PLPGSQL_RC_OK:
  1054. break;
  1055. case PLPGSQL_RC_EXIT:
  1056. if (estate->exitlabel == NULL)
  1057. return PLPGSQL_RC_OK;
  1058. if (stmt->label == NULL)
  1059. return PLPGSQL_RC_EXIT;
  1060. if (strcmp(stmt->label, estate->exitlabel))
  1061. return PLPGSQL_RC_EXIT;
  1062. estate->exitlabel = NULL;
  1063. return PLPGSQL_RC_OK;
  1064. case PLPGSQL_RC_RETURN:
  1065. return PLPGSQL_RC_RETURN;
  1066. default:
  1067. elog(ERROR, "unknown rc %d from exec_stmts()", rc);
  1068. }
  1069. /* ----------
  1070.  * Increase/decrease loop var
  1071.  * ----------
  1072.  */
  1073. if (stmt->reverse)
  1074. var->value--;
  1075. else
  1076. var->value++;
  1077. }
  1078. return PLPGSQL_RC_OK;
  1079. }
  1080. /* ----------
  1081.  * exec_stmt_fors Execute a query, assign each
  1082.  * tuple to a record or row and
  1083.  * execute a group of statements
  1084.  * for it.
  1085.  * ----------
  1086.  */
  1087. static int
  1088. exec_stmt_fors(PLpgSQL_execstate * estate, PLpgSQL_stmt_fors * stmt)
  1089. {
  1090. PLpgSQL_rec *rec = NULL;
  1091. PLpgSQL_row *row = NULL;
  1092. SPITupleTable *tuptab;
  1093. int rc;
  1094. int i;
  1095. int n;
  1096. /* ----------
  1097.  * Initialize the global found variable to false
  1098.  * ----------
  1099.  */
  1100. exec_set_found(estate, false);
  1101. /* ----------
  1102.  * Determine if we assign to a record or a row
  1103.  * ----------
  1104.  */
  1105. if (stmt->rec != NULL)
  1106. rec = (PLpgSQL_rec *) (estate->datums[stmt->rec->recno]);
  1107. else
  1108. {
  1109. if (stmt->row != NULL)
  1110. row = (PLpgSQL_row *) (estate->datums[stmt->row->rowno]);
  1111. else
  1112. elog(ERROR, "unsupported target in exec_stmt_fors()");
  1113. }
  1114. /* ----------
  1115.  * Run the query
  1116.  * ----------
  1117.  */
  1118. exec_run_select(estate, stmt->query, 0);
  1119. n = SPI_processed;
  1120. /* ----------
  1121.  * If the query didn't return any row, set the target
  1122.  * to NULL and return.
  1123.  * ----------
  1124.  */
  1125. if (n == 0)
  1126. {
  1127. exec_move_row(estate, rec, row, NULL, NULL);
  1128. return PLPGSQL_RC_OK;
  1129. }
  1130. /* ----------
  1131.  * There are tuples, so set found to true
  1132.  * ----------
  1133.  */
  1134. exec_set_found(estate, true);
  1135. /* ----------
  1136.  * Now do the loop
  1137.  * ----------
  1138.  */
  1139. tuptab = SPI_tuptable;
  1140. SPI_tuptable = NULL;
  1141. for (i = 0; i < n; i++)
  1142. {
  1143. /* ----------
  1144.  * Assign the tuple to the target
  1145.  * ----------
  1146.  */
  1147. exec_move_row(estate, rec, row, tuptab->vals[i], tuptab->tupdesc);
  1148. /* ----------
  1149.  * Execute the statements
  1150.  * ----------
  1151.  */
  1152. rc = exec_stmts(estate, stmt->body);
  1153. /* ----------
  1154.  * Check returncode
  1155.  * ----------
  1156.  */
  1157. switch (rc)
  1158. {
  1159. case PLPGSQL_RC_OK:
  1160. break;
  1161. case PLPGSQL_RC_EXIT:
  1162. if (estate->exitlabel == NULL)
  1163. return PLPGSQL_RC_OK;
  1164. if (stmt->label == NULL)
  1165. return PLPGSQL_RC_EXIT;
  1166. if (strcmp(stmt->label, estate->exitlabel))
  1167. return PLPGSQL_RC_EXIT;
  1168. estate->exitlabel = NULL;
  1169. return PLPGSQL_RC_OK;
  1170. case PLPGSQL_RC_RETURN:
  1171. return PLPGSQL_RC_RETURN;
  1172. default:
  1173. elog(ERROR, "unknown rc %d from exec_stmts()", rc);
  1174. }
  1175. }
  1176. return PLPGSQL_RC_OK;
  1177. }
  1178. /* ----------
  1179.  * exec_stmt_select Run a query and assign the first
  1180.  * row to a record or rowtype.
  1181.  *  ----------
  1182.  */
  1183. static int
  1184. exec_stmt_select(PLpgSQL_execstate * estate, PLpgSQL_stmt_select * stmt)
  1185. {
  1186. PLpgSQL_rec *rec = NULL;
  1187. PLpgSQL_row *row = NULL;
  1188. SPITupleTable *tuptab;
  1189. int n;
  1190. /* ----------
  1191.  * Initialize the global found variable to false
  1192.  * ----------
  1193.  */
  1194. exec_set_found(estate, false);
  1195. /* ----------
  1196.  * Determine if we assign to a record or a row
  1197.  * ----------
  1198.  */
  1199. if (stmt->rec != NULL)
  1200. rec = (PLpgSQL_rec *) (estate->datums[stmt->rec->recno]);
  1201. else
  1202. {
  1203. if (stmt->row != NULL)
  1204. row = (PLpgSQL_row *) (estate->datums[stmt->row->rowno]);
  1205. else
  1206. elog(ERROR, "unsupported target in exec_stmt_select()");
  1207. }
  1208. /* ----------
  1209.  * Run the query
  1210.  * ----------
  1211.  */
  1212. exec_run_select(estate, stmt->query, 1);
  1213. n = SPI_processed;
  1214. /* ----------
  1215.  * If the query didn't return any row, set the target
  1216.  * to NULL and return.
  1217.  * ----------
  1218.  */
  1219. if (n == 0)
  1220. {
  1221. exec_move_row(estate, rec, row, NULL, NULL);
  1222. return PLPGSQL_RC_OK;
  1223. }
  1224. /* ----------
  1225.  * Put the result into the target and set found to true
  1226.  * ----------
  1227.  */
  1228. tuptab = SPI_tuptable;
  1229. SPI_tuptable = NULL;
  1230. exec_move_row(estate, rec, row, tuptab->vals[0], tuptab->tupdesc);
  1231. exec_set_found(estate, true);
  1232. return PLPGSQL_RC_OK;
  1233. }
  1234. /* ----------
  1235.  * exec_stmt_exit Start exiting loop(s) or blocks
  1236.  * ----------
  1237.  */
  1238. static int
  1239. exec_stmt_exit(PLpgSQL_execstate * estate, PLpgSQL_stmt_exit * stmt)
  1240. {
  1241. Datum value;
  1242. Oid valtype;
  1243. bool isnull = false;
  1244. /* ----------
  1245.  * If the exit has a condition, check that it's true
  1246.  * ----------
  1247.  */
  1248. if (stmt->cond != NULL)
  1249. {
  1250. value = exec_eval_expr(estate, stmt->cond, &isnull, &valtype);
  1251. if (!value)
  1252. return PLPGSQL_RC_OK;
  1253. }
  1254. estate->exitlabel = stmt->label;
  1255. return PLPGSQL_RC_EXIT;
  1256. }
  1257. /* ----------
  1258.  * exec_stmt_return Evaluate an expression and start
  1259.  * returning from the function.
  1260.  * ----------
  1261.  */
  1262. static int
  1263. exec_stmt_return(PLpgSQL_execstate * estate, PLpgSQL_stmt_return * stmt)
  1264. {
  1265. if (estate->retistuple)
  1266. {
  1267. if (stmt->retrecno >= 0)
  1268. {
  1269. PLpgSQL_rec *rec = (PLpgSQL_rec *) (estate->datums[stmt->retrecno]);
  1270. estate->retval = (Datum) (rec->tup);
  1271. estate->rettupdesc = rec->tupdesc;
  1272. estate->retisnull = !HeapTupleIsValid(rec->tup);
  1273. return PLPGSQL_RC_RETURN;
  1274. }
  1275. if (stmt->expr == NULL)
  1276. {
  1277. estate->retval = (Datum) 0;
  1278. estate->rettupdesc = NULL;
  1279. estate->retisnull = true;
  1280. }
  1281. else
  1282. {
  1283. exec_run_select(estate, stmt->expr, 1);
  1284. estate->retval = (Datum) SPI_copytuple(SPI_tuptable->vals[0]);
  1285. estate->rettupdesc = SPI_tuptable->tupdesc;
  1286. estate->retisnull = false;
  1287. }
  1288. return PLPGSQL_RC_RETURN;
  1289. }
  1290. estate->retval = exec_eval_expr(estate, stmt->expr,
  1291. &(estate->retisnull),
  1292. &(estate->rettype));
  1293. return PLPGSQL_RC_RETURN;
  1294. }
  1295. /* ----------
  1296.  * exec_stmt_raise Build a message and throw it with
  1297.  * elog()
  1298.  * ----------
  1299.  */
  1300. static int
  1301. exec_stmt_raise(PLpgSQL_execstate * estate, PLpgSQL_stmt_raise * stmt)
  1302. {
  1303. HeapTuple typetup;
  1304. Form_pg_type typeStruct;
  1305. FmgrInfo finfo_output;
  1306. char    *extval;
  1307. int pidx = 0;
  1308. char c[2] = {0, 0};
  1309. char    *cp;
  1310. PLpgSQL_dstring ds;
  1311. PLpgSQL_var *var;
  1312. PLpgSQL_rec *rec;
  1313. PLpgSQL_recfield *recfield;
  1314. int fno;
  1315. plpgsql_dstring_init(&ds);
  1316. for (cp = stmt->message; *cp; cp++)
  1317. {
  1318. /* ----------
  1319.  * Occurences of a single % are replaced by the next
  1320.  * arguments external representation. Double %'s are
  1321.  * left as is so elog() will also don't touch them.
  1322.  * ----------
  1323.  */
  1324. if ((c[0] = *cp) == '%')
  1325. {
  1326. cp++;
  1327. if (*cp == '%')
  1328. {
  1329. plpgsql_dstring_append(&ds, c);
  1330. plpgsql_dstring_append(&ds, c);
  1331. continue;
  1332. }
  1333. cp--;
  1334. if (pidx >= stmt->nparams)
  1335. {
  1336. plpgsql_dstring_append(&ds, c);
  1337. plpgsql_dstring_append(&ds, c);
  1338. continue;
  1339. }
  1340. switch (estate->datums[stmt->params[pidx]]->dtype)
  1341. {
  1342. case PLPGSQL_DTYPE_VAR:
  1343. var = (PLpgSQL_var *)
  1344. (estate->datums[stmt->params[pidx]]);
  1345. if (var->isnull)
  1346. extval = "<NULL>";
  1347. else
  1348. {
  1349. typetup = SearchSysCacheTuple(TYPOID,
  1350. ObjectIdGetDatum(var->datatype->typoid), 0, 0, 0);
  1351. if (!HeapTupleIsValid(typetup))
  1352. elog(ERROR, "cache lookup for type %u failed (1)", var->datatype->typoid);
  1353. typeStruct = (Form_pg_type) GETSTRUCT(typetup);
  1354. fmgr_info(typeStruct->typoutput, &finfo_output);
  1355. extval = (char *) (*fmgr_faddr(&finfo_output)) (var->value, &(var->isnull), var->datatype->atttypmod);
  1356. }
  1357. plpgsql_dstring_append(&ds, extval);
  1358. break;
  1359. case PLPGSQL_DTYPE_RECFIELD:
  1360. recfield = (PLpgSQL_recfield *)
  1361. (estate->datums[stmt->params[pidx]]);
  1362. rec = (PLpgSQL_rec *)
  1363. (estate->datums[recfield->recno]);
  1364. if (!HeapTupleIsValid(rec->tup))
  1365. extval = "<NULL>";
  1366. else
  1367. {
  1368. fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
  1369. if (fno == SPI_ERROR_NOATTRIBUTE)
  1370. elog(ERROR, "record %s has no field %s", rec->refname, recfield->fieldname);
  1371. extval = SPI_getvalue(rec->tup, rec->tupdesc, fno);
  1372. }
  1373. plpgsql_dstring_append(&ds, extval);
  1374. break;
  1375. case PLPGSQL_DTYPE_TRIGARG:
  1376. {
  1377. PLpgSQL_trigarg *trigarg;
  1378. int value;
  1379. Oid valtype;
  1380. bool valisnull = false;
  1381. trigarg = (PLpgSQL_trigarg *)
  1382. (estate->datums[stmt->params[pidx]]);
  1383. value = (int) exec_eval_expr(estate, trigarg->argnum,
  1384.    &valisnull, &valtype);
  1385. if (valisnull)
  1386. extval = "<INDEX_IS_NULL>";
  1387. else
  1388. {
  1389. if (value < 0 || value >= estate->trig_nargs)
  1390. extval = "<OUT_OF_RANGE>";
  1391. else
  1392. extval = textout((text *) (estate->trig_argv[value]));
  1393. }
  1394. plpgsql_dstring_append(&ds, extval);
  1395. }
  1396. break;
  1397. default:
  1398. c[0] = '?';
  1399. plpgsql_dstring_append(&ds, c);
  1400. break;
  1401. }
  1402. pidx++;
  1403. continue;
  1404. }
  1405. /* ----------
  1406.  * Occurences of single ' are removed. double ' are reduced
  1407.  * to single ones.
  1408.  * ----------
  1409.  */
  1410. if (*cp == ''')
  1411. {
  1412. cp++;
  1413. if (*cp == ''')
  1414. plpgsql_dstring_append(&ds, c);
  1415. else
  1416. cp--;
  1417. continue;
  1418. }
  1419. plpgsql_dstring_append(&ds, c);
  1420. }
  1421. /* ----------
  1422.  * Now suppress debug info and throw the elog()
  1423.  * ----------
  1424.  */
  1425. if (stmt->elog_level == ERROR)
  1426. {
  1427. error_info_func = NULL;
  1428. error_info_stmt = NULL;
  1429. error_info_text = NULL;
  1430. }
  1431. elog(stmt->elog_level, "%s", plpgsql_dstring_get(&ds));
  1432. plpgsql_dstring_free(&ds);
  1433. return PLPGSQL_RC_OK;
  1434. }
  1435. /* ----------
  1436.  * Generate a prepared plan
  1437.  * ----------
  1438.  */
  1439. static void
  1440. exec_prepare_plan(PLpgSQL_execstate * estate,
  1441.   PLpgSQL_expr * expr)
  1442. {
  1443. PLpgSQL_var *var;
  1444. PLpgSQL_rec *rec;
  1445. PLpgSQL_recfield *recfield;
  1446. int i;
  1447. int fno;
  1448. void    *plan;
  1449. Oid    *argtypes;
  1450. /* ----------
  1451.  * Setup the argtypes array
  1452.  * ----------
  1453.  */
  1454. argtypes = malloc(sizeof(Oid *) * (expr->nparams + 1));
  1455. for (i = 0; i < expr->nparams; i++)
  1456. {
  1457. switch (estate->datums[expr->params[i]]->dtype)
  1458. {
  1459. case PLPGSQL_DTYPE_VAR:
  1460. var = (PLpgSQL_var *) (estate->datums[expr->params[i]]);
  1461. argtypes[i] = var->datatype->typoid;
  1462. break;
  1463. case PLPGSQL_DTYPE_RECFIELD:
  1464. recfield = (PLpgSQL_recfield *) (estate->datums[expr->params[i]]);
  1465. rec = (PLpgSQL_rec *) (estate->datums[recfield->recno]);
  1466. if (!HeapTupleIsValid(rec->tup))
  1467. elog(ERROR, "record %s is unassigned yet", rec->refname);
  1468. fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
  1469. if (fno == SPI_ERROR_NOATTRIBUTE)
  1470. elog(ERROR, "record %s has no field %s", rec->refname, recfield->fieldname);
  1471. argtypes[i] = SPI_gettypeid(rec->tupdesc, fno);
  1472. break;
  1473. case PLPGSQL_DTYPE_TRIGARG:
  1474. argtypes[i] = (Oid) TEXTOID;
  1475. break;
  1476. default:
  1477. elog(ERROR, "unknown parameter dtype %d in exec_run_select()", estate->datums[expr->params[i]]);
  1478. }
  1479. }
  1480. /* ----------
  1481.  * Generate and save the plan
  1482.  * ----------
  1483.  */
  1484. plan = SPI_prepare(expr->query, expr->nparams, argtypes);
  1485. if (plan == NULL)
  1486. elog(ERROR, "SPI_prepare() failed on "%s"", expr->query);
  1487. expr->plan = SPI_saveplan(plan);
  1488. expr->plan_argtypes = argtypes;
  1489. expr->plan_simple_expr = NULL;
  1490. exec_simple_check_plan(expr);
  1491. }
  1492. /* ----------
  1493.  * exec_stmt_execsql Execute an SQL statement not
  1494.  * returning any data.
  1495.  * ----------
  1496.  */
  1497. static int
  1498. exec_stmt_execsql(PLpgSQL_execstate * estate,
  1499.   PLpgSQL_stmt_execsql * stmt)
  1500. {
  1501. PLpgSQL_var *var;
  1502. PLpgSQL_rec *rec;
  1503. PLpgSQL_recfield *recfield;
  1504. PLpgSQL_trigarg *trigarg;
  1505. int tgargno;
  1506. Oid tgargoid;
  1507. int fno;
  1508. int i;
  1509. Datum    *values;
  1510. char    *nulls;
  1511. int rc;
  1512. PLpgSQL_expr *expr = stmt->sqlstmt;
  1513. bool isnull;
  1514. /* ----------
  1515.  * On the first call for this expression generate the plan
  1516.  * ----------
  1517.  */
  1518. if (expr->plan == NULL)
  1519. exec_prepare_plan(estate, expr);
  1520. /* ----------
  1521.  * Now build up the values and nulls arguments for SPI_execp()
  1522.  * ----------
  1523.  */
  1524. values = palloc(sizeof(Datum) * (expr->nparams + 1));
  1525. nulls = palloc(expr->nparams + 1);
  1526. for (i = 0; i < expr->nparams; i++)
  1527. {
  1528. switch (estate->datums[expr->params[i]]->dtype)
  1529. {
  1530. case PLPGSQL_DTYPE_VAR:
  1531. var = (PLpgSQL_var *) (estate->datums[expr->params[i]]);
  1532. values[i] = var->value;
  1533. if (var->isnull)
  1534. nulls[i] = 'n';
  1535. else
  1536. nulls[i] = ' ';
  1537. break;
  1538. case PLPGSQL_DTYPE_RECFIELD:
  1539. recfield = (PLpgSQL_recfield *) (estate->datums[expr->params[i]]);
  1540. rec = (PLpgSQL_rec *) (estate->datums[recfield->recno]);
  1541. if (!HeapTupleIsValid(rec->tup))
  1542. elog(ERROR, "record %s is unassigned yet", rec->refname);
  1543. fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
  1544. if (fno == SPI_ERROR_NOATTRIBUTE)
  1545. elog(ERROR, "record %s has no field %s", rec->refname, recfield->fieldname);
  1546. if (expr->plan_argtypes[i] != SPI_gettypeid(rec->tupdesc, fno))
  1547. elog(ERROR, "type of %s.%s doesn't match that when preparing the plan", rec->refname, recfield->fieldname);
  1548. values[i] = SPI_getbinval(rec->tup, rec->tupdesc, fno, &isnull);
  1549. if (isnull)
  1550. nulls[i] = 'n';
  1551. else
  1552. nulls[i] = ' ';
  1553. break;
  1554. case PLPGSQL_DTYPE_TRIGARG:
  1555. trigarg = (PLpgSQL_trigarg *) (estate->datums[expr->params[i]]);
  1556. tgargno = (int) exec_eval_expr(estate, trigarg->argnum,
  1557.    &isnull, &tgargoid);
  1558. if (isnull || tgargno < 0 || tgargno >= estate->trig_nargs)
  1559. {
  1560. values[i] = 0;
  1561. nulls[i] = 'n';
  1562. }
  1563. else
  1564. {
  1565. values[i] = estate->trig_argv[tgargno];
  1566. nulls[i] = ' ';
  1567. }
  1568. break;
  1569. default:
  1570. elog(ERROR, "unknown parameter dtype %d in exec_stmt_execsql()", estate->datums[expr->params[i]]->dtype);
  1571. }
  1572. }
  1573. nulls[i] = '';
  1574. /* ----------
  1575.  * Execute the plan
  1576.  * ----------
  1577.  */
  1578. rc = SPI_execp(expr->plan, values, nulls, 0);
  1579. switch (rc)
  1580. {
  1581. case SPI_OK_UTILITY:
  1582. case SPI_OK_SELINTO:
  1583. case SPI_OK_INSERT:
  1584. case SPI_OK_DELETE:
  1585. case SPI_OK_UPDATE:
  1586. break;
  1587. case SPI_OK_SELECT:
  1588. elog(ERROR, "unexpected SELECT query in exec_stmt_execsql()");
  1589. default:
  1590. elog(ERROR, "error executing query "%s"",
  1591.  expr->query);
  1592. }
  1593. pfree(values);
  1594. pfree(nulls);
  1595. return PLPGSQL_RC_OK;
  1596. }
  1597. /* ----------
  1598.  * exec_assign_expr Put an expressions result into
  1599.  * a variable.
  1600.  * ----------
  1601.  */
  1602. static void
  1603. exec_assign_expr(PLpgSQL_execstate * estate, PLpgSQL_datum * target,
  1604.  PLpgSQL_expr * expr)
  1605. {
  1606. Datum value;
  1607. Oid valtype;
  1608. bool isnull = false;
  1609. value = exec_eval_expr(estate, expr, &isnull, &valtype);
  1610. if (target != NULL)
  1611. exec_assign_value(estate, target, value, valtype, &isnull);
  1612. }
  1613. /* ----------
  1614.  * exec_assign_value Put a value into a target field
  1615.  * ----------
  1616.  */
  1617. static void
  1618. exec_assign_value(PLpgSQL_execstate * estate,
  1619.   PLpgSQL_datum * target,
  1620.   Datum value, Oid valtype, bool *isNull)
  1621. {
  1622. PLpgSQL_var *var;
  1623. PLpgSQL_rec *rec;
  1624. PLpgSQL_recfield *recfield;
  1625. int fno;
  1626. int i;
  1627. int natts;
  1628. Datum    *values;
  1629. char    *nulls;
  1630. bool attisnull;
  1631. Oid atttype;
  1632. int4 atttypmod;
  1633. HeapTuple typetup;
  1634. Form_pg_type typeStruct;
  1635. FmgrInfo finfo_input;
  1636. switch (target->dtype)
  1637. {
  1638. case PLPGSQL_DTYPE_VAR:
  1639. /* ----------
  1640.  * Target field is a variable - that's easy
  1641.  * ----------
  1642.  */
  1643. var = (PLpgSQL_var *) target;
  1644. var->value = exec_cast_value(value, valtype, var->datatype->typoid,
  1645.  &(var->datatype->typinput),
  1646.    var->datatype->atttypmod, isNull);
  1647. if (isNull && var->notnull)
  1648. elog(ERROR, "NULL assignment to variable '%s' declared NOT NULL", var->refname);
  1649. var->isnull = *isNull;
  1650. break;
  1651. case PLPGSQL_DTYPE_RECFIELD:
  1652. /* ----------
  1653.  * Target field is a record
  1654.  * ----------
  1655.  */
  1656. recfield = (PLpgSQL_recfield *) target;
  1657. rec = (PLpgSQL_rec *) (estate->datums[recfield->recno]);
  1658. /* ----------
  1659.  * Check that there is already a tuple in the record.
  1660.  * We need that because records don't have any predefined
  1661.  * field structure.
  1662.  * ----------
  1663.  */
  1664. if (!HeapTupleIsValid(rec->tup))
  1665. elog(ERROR, "record %s is unassigned yet - don't know it's tuple structure", rec->refname);
  1666. /* ----------
  1667.  * Get the number of the records field to change and the
  1668.  * number of attributes in the tuple.
  1669.  * ----------
  1670.  */
  1671. fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
  1672. if (fno == SPI_ERROR_NOATTRIBUTE)
  1673. elog(ERROR, "record %s has no field %s", rec->refname, recfield->fieldname);
  1674. fno--;
  1675. natts = rec->tupdesc->natts;
  1676. /* ----------
  1677.  * We loop over the attributes of the rec's current tuple
  1678.  * and collect the values in a Datum array along with the
  1679.  * nulls information.
  1680.  * ----------
  1681.  */
  1682. values = palloc(sizeof(Datum) * natts);
  1683. nulls = palloc(natts + 1);
  1684. for (i = 0; i < natts; i++)
  1685. {
  1686. /* ----------
  1687.  * If this isn't the field we assign to, just use the
  1688.  * value that's already in the tuple.
  1689.  * ----------
  1690.  */
  1691. if (i != fno)
  1692. {
  1693. values[i] = SPI_getbinval(rec->tup, rec->tupdesc,
  1694.   i + 1, &attisnull);
  1695. if (attisnull)
  1696. nulls[i] = 'n';
  1697. else
  1698. nulls[i] = ' ';
  1699. continue;
  1700. }
  1701. /* ----------
  1702.  * This is the field to change. Get it's type
  1703.  * and cast the value we insert to that type.
  1704.  * ----------
  1705.  */
  1706. atttype = SPI_gettypeid(rec->tupdesc, i + 1);
  1707. atttypmod = rec->tupdesc->attrs[i]->atttypmod;
  1708. typetup = SearchSysCacheTuple(TYPOID,
  1709.  ObjectIdGetDatum(atttype), 0, 0, 0);
  1710. if (!HeapTupleIsValid(typetup))
  1711. elog(ERROR, "cache lookup for type %u failed", atttype);
  1712. typeStruct = (Form_pg_type) GETSTRUCT(typetup);
  1713. fmgr_info(typeStruct->typinput, &finfo_input);
  1714. attisnull = *isNull;
  1715. values[i] = exec_cast_value(value, valtype,
  1716.    atttype, &finfo_input, atttypmod, &attisnull);
  1717. if (attisnull)
  1718. nulls[i] = 'n';
  1719. else
  1720. nulls[i] = ' ';
  1721. }
  1722. /* ----------
  1723.  * Now call heap_formtuple() to create a new tuple
  1724.  * that replaces the old one in the record.
  1725.  * ----------
  1726.  */
  1727. nulls[i] = '';
  1728. rec->tup = heap_formtuple(rec->tupdesc, values, nulls);
  1729. pfree(values);
  1730. pfree(nulls);
  1731. break;
  1732. default:
  1733. elog(ERROR, "unknown dtype %d in exec_assign_value()",
  1734.  target->dtype);
  1735. }
  1736. }
  1737. /* ----------
  1738.  * exec_eval_expr Evaluate an expression and return
  1739.  * the result Datum.
  1740.  * ----------
  1741.  */
  1742. static Datum
  1743. exec_eval_expr(PLpgSQL_execstate * estate,
  1744.    PLpgSQL_expr * expr,
  1745.    bool *isNull,
  1746.    Oid *rettype)
  1747. {
  1748. int rc;
  1749. /* ----------
  1750.  * If not already done create a plan for this expression
  1751.  * ----------
  1752.  */
  1753. if (expr->plan == NULL)
  1754. exec_prepare_plan(estate, expr);
  1755. /* ----------
  1756.  * If this is a simple expression, bypass SPI and use the
  1757.  * executor directly
  1758.  * ----------
  1759.  */
  1760. if (expr->plan_simple_expr != NULL)
  1761. return exec_eval_simple_expr(estate, expr, isNull, rettype);
  1762. rc = exec_run_select(estate, expr, 2);
  1763. if (rc != SPI_OK_SELECT)
  1764. elog(ERROR, "query "%s" didn't return data", expr->query);
  1765. /* ----------
  1766.  * If there are no rows selected, the result is NULL.
  1767.  * ----------
  1768.  */
  1769. if (SPI_processed == 0)
  1770. {
  1771. *isNull = true;
  1772. return (Datum) 0;
  1773. }
  1774. /* ----------
  1775.  * Check that the expression returned one single Datum
  1776.  * ----------
  1777.  */
  1778. if (SPI_processed > 1)
  1779. elog(ERROR, "query "%s" didn't return a single value", expr->query);
  1780. if (SPI_tuptable->tupdesc->natts != 1)
  1781. elog(ERROR, "query "%s" didn't return a single value", expr->query);
  1782. /* ----------
  1783.  * Return the result and it's type
  1784.  * ----------
  1785.  */
  1786. *rettype = SPI_gettypeid(SPI_tuptable->tupdesc, 1);
  1787. return SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, isNull);
  1788. }
  1789. /* ----------
  1790.  * exec_run_select Execute a select query
  1791.  * ----------
  1792.  */
  1793. static int
  1794. exec_run_select(PLpgSQL_execstate * estate,
  1795. PLpgSQL_expr * expr, int maxtuples)
  1796. {
  1797. PLpgSQL_var *var;
  1798. PLpgSQL_rec *rec;
  1799. PLpgSQL_recfield *recfield;
  1800. PLpgSQL_trigarg *trigarg;
  1801. int tgargno;
  1802. Oid tgargoid;
  1803. int i;
  1804. Datum    *values;
  1805. char    *nulls;
  1806. int rc;
  1807. int fno;
  1808. bool isnull;
  1809. /* ----------
  1810.  * On the first call for this expression generate the plan
  1811.  * ----------
  1812.  */
  1813. if (expr->plan == NULL)
  1814. exec_prepare_plan(estate, expr);
  1815. /* ----------
  1816.  * Now build up the values and nulls arguments for SPI_execp()
  1817.  * ----------
  1818.  */
  1819. values = palloc(sizeof(Datum) * (expr->nparams + 1));
  1820. nulls = palloc(expr->nparams + 1);
  1821. for (i = 0; i < expr->nparams; i++)
  1822. {
  1823. switch (estate->datums[expr->params[i]]->dtype)
  1824. {
  1825. case PLPGSQL_DTYPE_VAR:
  1826. var = (PLpgSQL_var *) (estate->datums[expr->params[i]]);
  1827. values[i] = var->value;
  1828. if (var->isnull)
  1829. nulls[i] = 'n';
  1830. else
  1831. nulls[i] = ' ';
  1832. break;
  1833. case PLPGSQL_DTYPE_RECFIELD:
  1834. recfield = (PLpgSQL_recfield *) (estate->datums[expr->params[i]]);
  1835. rec = (PLpgSQL_rec *) (estate->datums[recfield->recno]);
  1836. if (!HeapTupleIsValid(rec->tup))
  1837. elog(ERROR, "record %s is unassigned yet", rec->refname);
  1838. fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
  1839. if (fno == SPI_ERROR_NOATTRIBUTE)
  1840. elog(ERROR, "record %s has no field %s", rec->refname, recfield->fieldname);
  1841. if (expr->plan_argtypes[i] != SPI_gettypeid(rec->tupdesc, fno))
  1842. elog(ERROR, "type of %s.%s doesn't match that when preparing the plan", rec->refname, recfield->fieldname);
  1843. values[i] = SPI_getbinval(rec->tup, rec->tupdesc, fno, &isnull);
  1844. if (isnull)
  1845. nulls[i] = 'n';
  1846. else
  1847. nulls[i] = ' ';
  1848. break;
  1849. case PLPGSQL_DTYPE_TRIGARG:
  1850. trigarg = (PLpgSQL_trigarg *) (estate->datums[expr->params[i]]);
  1851. tgargno = (int) exec_eval_expr(estate, trigarg->argnum,
  1852.    &isnull, &tgargoid);
  1853. if (isnull || tgargno < 0 || tgargno >= estate->trig_nargs)
  1854. {
  1855. values[i] = 0;
  1856. nulls[i] = 'n';
  1857. }
  1858. else
  1859. {
  1860. values[i] = estate->trig_argv[tgargno];
  1861. nulls[i] = ' ';
  1862. }
  1863. break;
  1864. default:
  1865. elog(ERROR, "unknown parameter dtype %d in exec_eval_expr()", estate->datums[expr->params[i]]);
  1866. }
  1867. }
  1868. nulls[i] = '';
  1869. /* ----------
  1870.  * Execute the query
  1871.  * ----------
  1872.  */
  1873. rc = SPI_execp(expr->plan, values, nulls, maxtuples);
  1874. if (rc != SPI_OK_SELECT)
  1875. elog(ERROR, "query "%s" isn't a SELECT", expr->query);
  1876. pfree(values);
  1877. pfree(nulls);
  1878. return rc;
  1879. }
  1880. /* ----------
  1881.  * exec_eval_simple_expr - Evaluate a simple expression returning
  1882.  * a Datum by directly calling ExecEvalExpr().
  1883.  * ----------
  1884.  */
  1885. static Datum
  1886. exec_eval_simple_expr(PLpgSQL_execstate * estate,
  1887.   PLpgSQL_expr * expr,
  1888.   bool *isNull,
  1889.   Oid *rettype)
  1890. {
  1891. Datum retval;
  1892. PLpgSQL_var *var;
  1893. PLpgSQL_rec *rec;
  1894. PLpgSQL_recfield *recfield;
  1895. PLpgSQL_trigarg *trigarg;
  1896. int tgargno;
  1897. Oid tgargoid;
  1898. int fno;
  1899. int i;
  1900. bool isnull;
  1901. bool isdone;
  1902. ExprContext *econtext;
  1903. ParamListInfo paramLI;
  1904. /* ----------
  1905.  * Create a simple expression context to hold the arguments
  1906.  * ----------
  1907.  */
  1908. econtext = makeNode(ExprContext);
  1909. paramLI = (ParamListInfo) palloc((expr->nparams + 1) *
  1910.  sizeof(ParamListInfoData));
  1911. econtext->ecxt_param_list_info = paramLI;
  1912. /* ----------
  1913.  * Put the parameter values into the parameter list info of
  1914.  * the expression context.
  1915.  * ----------
  1916.  */
  1917. for (i = 0; i < expr->nparams; i++, paramLI++)
  1918. {
  1919. paramLI->kind = PARAM_NUM;
  1920. paramLI->id = i + 1;
  1921. switch (estate->datums[expr->params[i]]->dtype)
  1922. {
  1923. case PLPGSQL_DTYPE_VAR:
  1924. var = (PLpgSQL_var *) (estate->datums[expr->params[i]]);
  1925. paramLI->isnull = var->isnull;
  1926. paramLI->value = var->value;
  1927. break;
  1928. case PLPGSQL_DTYPE_RECFIELD:
  1929. recfield = (PLpgSQL_recfield *) (estate->datums[expr->params[i]]);
  1930. rec = (PLpgSQL_rec *) (estate->datums[recfield->recno]);
  1931. if (!HeapTupleIsValid(rec->tup))
  1932. elog(ERROR, "record %s is unassigned yet", rec->refname);
  1933. fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
  1934. if (fno == SPI_ERROR_NOATTRIBUTE)
  1935. elog(ERROR, "record %s has no field %s", rec->refname, recfield->fieldname);
  1936. if (expr->plan_argtypes[i] != SPI_gettypeid(rec->tupdesc, fno))
  1937. elog(ERROR, "type of %s.%s doesn't match that when preparing the plan", rec->refname, recfield->fieldname);
  1938. paramLI->value = SPI_getbinval(rec->tup, rec->tupdesc, fno, &isnull);
  1939. paramLI->isnull = isnull;
  1940. break;
  1941. case PLPGSQL_DTYPE_TRIGARG:
  1942. trigarg = (PLpgSQL_trigarg *) (estate->datums[expr->params[i]]);
  1943. tgargno = (int) exec_eval_expr(estate, trigarg->argnum,
  1944.    &isnull, &tgargoid);
  1945. if (isnull || tgargno < 0 || tgargno >= estate->trig_nargs)
  1946. {
  1947. paramLI->value = 0;
  1948. paramLI->isnull = TRUE;
  1949. }
  1950. else
  1951. {
  1952. paramLI->value = estate->trig_argv[tgargno];
  1953. paramLI->isnull = FALSE;
  1954. }
  1955. break;
  1956. default:
  1957. elog(ERROR, "unknown parameter dtype %d in exec_eval_simple_expr()", estate->datums[expr->params[i]]->dtype);
  1958. }
  1959. }
  1960. paramLI->kind = PARAM_INVALID;
  1961. /* ----------
  1962.  * Initialize things
  1963.  * ----------
  1964.  */
  1965. *isNull = FALSE;
  1966. *rettype = expr->plan_simple_type;
  1967. isdone = FALSE;
  1968. /* ----------
  1969.  * Clear the function cache
  1970.  * ----------
  1971.  */
  1972. exec_eval_clear_fcache(expr->plan_simple_expr);
  1973. /* ----------
  1974.  * Now call the executor to evaluate the expression
  1975.  * ----------
  1976.  */
  1977. SPI_push();
  1978. retval = ExecEvalExpr(expr->plan_simple_expr,
  1979.   econtext,
  1980.   isNull,
  1981.   &isdone);
  1982. SPI_pop();
  1983. /* ----------
  1984.  * That's it.
  1985.  * ----------
  1986.  */
  1987. return retval;
  1988. }
  1989. /* ----------
  1990.  * exec_move_row Move one tuples values into a
  1991.  * record or row
  1992.  * ----------
  1993.  */
  1994. static void
  1995. exec_move_row(PLpgSQL_execstate * estate,
  1996.   PLpgSQL_rec * rec,
  1997.   PLpgSQL_row * row,
  1998.   HeapTuple tup, TupleDesc tupdesc)
  1999. {
  2000. PLpgSQL_var *var;
  2001. int i;
  2002. Datum value;
  2003. Oid valtype;
  2004. bool isnull;
  2005. /* ----------
  2006.  * Record is simple - just put the tuple and it's descriptor
  2007.  * into the record
  2008.  * ----------
  2009.  */
  2010. if (rec != NULL)
  2011. {
  2012. if (HeapTupleIsValid(tup))
  2013. {
  2014. rec->tup = tup;
  2015. rec->tupdesc = tupdesc;
  2016. }
  2017. else
  2018. {
  2019. rec->tup = NULL;
  2020. rec->tupdesc = NULL;
  2021. }
  2022. return;
  2023. }
  2024. /* ----------
  2025.  * Row is a bit more complicated in that we assign the single
  2026.  * attributes of the query to the variables the row points to.
  2027.  * ----------
  2028.  */
  2029. if (row != NULL)
  2030. {
  2031. if (HeapTupleIsValid(tup))
  2032. {
  2033. if (row->nfields != tupdesc->natts)
  2034. {
  2035. elog(ERROR, "query didn't return correct # of attributes for %s",
  2036.  row->refname);
  2037. }
  2038. for (i = 0; i < row->nfields; i++)
  2039. {
  2040. var = (PLpgSQL_var *) (estate->datums[row->varnos[i]]);
  2041. valtype = SPI_gettypeid(tupdesc, i + 1);
  2042. value = SPI_getbinval(tup, tupdesc, i + 1, &isnull);
  2043. exec_assign_value(estate, estate->datums[row->varnos[i]],
  2044.   value, valtype, &isnull);
  2045. }
  2046. }
  2047. else
  2048. {
  2049. for (i = 0; i < row->nfields; i++)
  2050. {
  2051. bool nullval = true;
  2052. exec_assign_value(estate, estate->datums[row->varnos[i]],
  2053.   (Datum) 0, 0, &nullval);
  2054. }
  2055. }
  2056. return;
  2057. }
  2058. elog(ERROR, "unsupported target in exec_move_row()");
  2059. }
  2060. /* ----------
  2061.  * exec_cast_value Cast a value if required
  2062.  * ----------
  2063.  */
  2064. static Datum
  2065. exec_cast_value(Datum value, Oid valtype,
  2066. Oid reqtype,
  2067. FmgrInfo *reqinput,
  2068. int16 reqtypmod,
  2069. bool *isnull)
  2070. {
  2071. if (!*isnull)
  2072. {
  2073. /* ----------
  2074.  * If the type of the queries return value isn't
  2075.  * that of the variable, convert it.
  2076.  * ----------
  2077.  */
  2078. if (valtype != reqtype || reqtypmod > 0)
  2079. {
  2080. HeapTuple typetup;
  2081. Form_pg_type typeStruct;
  2082. FmgrInfo finfo_output;
  2083. char    *extval;
  2084. typetup = SearchSysCacheTuple(TYPOID,
  2085.  ObjectIdGetDatum(valtype), 0, 0, 0);
  2086. if (!HeapTupleIsValid(typetup))
  2087. elog(ERROR, "cache lookup for type %u failed", valtype);
  2088. typeStruct = (Form_pg_type) GETSTRUCT(typetup);
  2089. fmgr_info(typeStruct->typoutput, &finfo_output);
  2090. extval = (char *) (*fmgr_faddr(&finfo_output)) (value, &isnull, -1);
  2091. value = (Datum) (*fmgr_faddr(reqinput)) (extval, &isnull, reqtypmod);
  2092. }
  2093. }
  2094. return value;
  2095. }
  2096. /* ----------
  2097.  * exec_simple_check_node - Recursively check if an expression
  2098.  * is made only of simple things we can
  2099.  * hand out directly to ExecEvalExpr()
  2100.  * instead of calling SPI.
  2101.  * ----------
  2102.  */
  2103. static bool
  2104. exec_simple_check_node(Node *node)
  2105. {
  2106. switch (nodeTag(node))
  2107. {
  2108. case T_Expr:
  2109. {
  2110. Expr    *expr = (Expr *) node;
  2111. List    *l;
  2112. switch (expr->opType)
  2113. {
  2114. case OP_EXPR:
  2115. case FUNC_EXPR:
  2116. case OR_EXPR:
  2117. case AND_EXPR:
  2118. case NOT_EXPR:
  2119. break;
  2120. default:
  2121. return FALSE;
  2122. }
  2123. foreach(l, expr->args)
  2124. {
  2125. if (!exec_simple_check_node(lfirst(l)))
  2126. return FALSE;
  2127. }
  2128. return TRUE;
  2129. }
  2130. case T_Param:
  2131. return TRUE;
  2132. case T_Const:
  2133. return TRUE;
  2134. default:
  2135. return FALSE;
  2136. }
  2137. }
  2138. /* ----------
  2139.  * exec_simple_check_plan - Check if a plan is simple enough to
  2140.  * be evaluated by ExecEvalExpr() instead
  2141.  * of SPI.
  2142.  * ----------
  2143.  */
  2144. static void
  2145. exec_simple_check_plan(PLpgSQL_expr * expr)
  2146. {
  2147. _SPI_plan  *spi_plan = (_SPI_plan *) expr->plan;
  2148. Plan    *plan;
  2149. TargetEntry *tle;
  2150. expr->plan_simple_expr = NULL;
  2151. /* ----------
  2152.  * 1. We can only evaluate queries that resulted in one single
  2153.  *   execution plan
  2154.  * ----------
  2155.  */
  2156. if (length(spi_plan->ptlist) != 1)
  2157. return;
  2158. plan = (Plan *) lfirst(spi_plan->ptlist);
  2159. /* ----------
  2160.  * 2. It must be a RESULT plan --> no scan's required
  2161.  * ----------
  2162.  */
  2163. if (plan == NULL) /* utility statement produces this */
  2164. return;
  2165. if (nodeTag(plan) != T_Result)
  2166. return;
  2167. /* ----------
  2168.  * 3. The plan must have a single attribute as result
  2169.  * ----------
  2170.  */
  2171. if (length(plan->targetlist) != 1)
  2172. return;
  2173. /* ----------
  2174.  * 4. Don't know if all these can break us, so let SPI handle
  2175.  *   those plans
  2176.  * ----------
  2177.  */
  2178. if (plan->qual != NULL || plan->lefttree != NULL || plan->righttree != NULL)
  2179. return;
  2180. /* ----------
  2181.  * 5. Check that all the nodes in the expression are one of
  2182.  *   Expr, Param or Const.
  2183.  * ----------
  2184.  */
  2185. tle = (TargetEntry *) lfirst(plan->targetlist);
  2186. if (!exec_simple_check_node(tle->expr))
  2187. return;
  2188. /* ----------
  2189.  * Yes - this is a simple expression. Remember the expression
  2190.  * and the return type
  2191.  * ----------
  2192.  */
  2193. expr->plan_simple_expr = tle->expr;
  2194. switch (nodeTag(tle->expr))
  2195. {
  2196. case T_Expr:
  2197. expr->plan_simple_type =
  2198. ((Expr *) (tle->expr))->typeOid;
  2199. break;
  2200. case T_Param:
  2201. expr->plan_simple_type =
  2202. ((Param *) (tle->expr))->paramtype;
  2203. break;
  2204. case T_Const:
  2205. expr->plan_simple_type = ((Const *) (tle->expr))->consttype;
  2206. break;
  2207. default:
  2208. expr->plan_simple_type = InvalidOid;
  2209. }
  2210. return;
  2211. }
  2212. /* ----------
  2213.  * exec_eval_clear_fcache - The function cache is palloc()'d by
  2214.  * the executor, and contains call specific
  2215.  * data based on the arguments. This has
  2216.  * to be recalculated.
  2217.  * ----------
  2218.  */
  2219. static void
  2220. exec_eval_clear_fcache(Node *node)
  2221. {
  2222. Expr    *expr;
  2223. List    *l;
  2224. if (nodeTag(node) != T_Expr)
  2225. return;
  2226. expr = (Expr *) node;
  2227. switch (expr->opType)
  2228. {
  2229. case OP_EXPR:
  2230. ((Oper *) (expr->oper))->op_fcache = NULL;
  2231. break;
  2232. case FUNC_EXPR:
  2233. ((Func *) (expr->oper))->func_fcache = NULL;
  2234. break;
  2235. default:
  2236. break;
  2237. }
  2238. foreach(l, expr->args)
  2239. exec_eval_clear_fcache(lfirst(l));
  2240. }
  2241. /* ----------
  2242.  * exec_set_found Set the global found variable
  2243.  * to true/false
  2244.  * ----------
  2245.  */
  2246. static void
  2247. exec_set_found(PLpgSQL_execstate * estate, bool state)
  2248. {
  2249. PLpgSQL_var *var;
  2250. var = (PLpgSQL_var *) (estate->datums[estate->found_varno]);
  2251. var->value = (Datum) state;
  2252. var->isnull = false;
  2253. }