PostgreSQL Source Code  git master
plpgsql.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * plpgsql.h - Definitions for the PL/pgSQL
4  * procedural language
5  *
6  * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  * src/pl/plpgsql/src/plpgsql.h
12  *
13  *-------------------------------------------------------------------------
14  */
15 
16 #ifndef PLPGSQL_H
17 #define PLPGSQL_H
18 
19 #include "access/xact.h"
20 #include "commands/event_trigger.h"
21 #include "commands/trigger.h"
22 #include "executor/spi.h"
23 #include "utils/expandedrecord.h"
24 #include "utils/typcache.h"
25 
26 
27 /**********************************************************************
28  * Definitions
29  **********************************************************************/
30 
31 /* define our text domain for translations */
32 #undef TEXTDOMAIN
33 #define TEXTDOMAIN PG_TEXTDOMAIN("plpgsql")
34 
35 #undef _
36 #define _(x) dgettext(TEXTDOMAIN, x)
37 
38 /*
39  * Compiler's namespace item types
40  */
41 typedef enum PLpgSQL_nsitem_type
42 {
43  PLPGSQL_NSTYPE_LABEL, /* block label */
44  PLPGSQL_NSTYPE_VAR, /* scalar variable */
45  PLPGSQL_NSTYPE_REC /* composite variable */
47 
48 /*
49  * A PLPGSQL_NSTYPE_LABEL stack entry must be one of these types
50  */
51 typedef enum PLpgSQL_label_type
52 {
53  PLPGSQL_LABEL_BLOCK, /* DECLARE/BEGIN block */
54  PLPGSQL_LABEL_LOOP, /* looping construct */
55  PLPGSQL_LABEL_OTHER /* anything else */
57 
58 /*
59  * Datum array node types
60  */
61 typedef enum PLpgSQL_datum_type
62 {
70 
71 /*
72  * DTYPE_PROMISE datums have these possible ways of computing the promise
73  */
75 {
76  PLPGSQL_PROMISE_NONE = 0, /* not a promise, or promise satisfied */
89 
90 /*
91  * Variants distinguished in PLpgSQL_type structs
92  */
93 typedef enum PLpgSQL_type_type
94 {
95  PLPGSQL_TTYPE_SCALAR, /* scalar types and domains */
96  PLPGSQL_TTYPE_REC, /* composite types, including RECORD */
97  PLPGSQL_TTYPE_PSEUDO /* pseudotypes */
99 
100 /*
101  * Execution tree node types
102  */
103 typedef enum PLpgSQL_stmt_type
104 {
134 
135 /*
136  * Execution node return codes
137  */
138 enum
139 {
144 };
145 
146 /*
147  * GET DIAGNOSTICS information items
148  */
150 {
164 
165 /*
166  * RAISE statement options
167  */
169 {
180 
181 /*
182  * Behavioral modes for plpgsql variable resolution
183  */
185 {
186  PLPGSQL_RESOLVE_ERROR, /* throw error if ambiguous */
187  PLPGSQL_RESOLVE_VARIABLE, /* prefer plpgsql var to table column */
188  PLPGSQL_RESOLVE_COLUMN /* prefer table column to plpgsql var */
190 
191 
192 /**********************************************************************
193  * Node and structure definitions
194  **********************************************************************/
195 
196 /*
197  * Postgres data type
198  */
199 typedef struct PLpgSQL_type
200 {
201  char *typname; /* (simple) name of the type */
202  Oid typoid; /* OID of the data type */
203  PLpgSQL_type_type ttype; /* PLPGSQL_TTYPE_ code */
204  int16 typlen; /* stuff copied from its pg_type entry */
205  bool typbyval;
206  char typtype;
207  Oid collation; /* from pg_type, but can be overridden */
208  bool typisarray; /* is "true" array, or domain over one */
209  int32 atttypmod; /* typmod (taken from someplace else) */
210  /* Remaining fields are used only for named composite types (not RECORD) */
211  TypeName *origtypname; /* type name as written by user */
212  TypeCacheEntry *tcache; /* typcache entry for composite type */
213  uint64 tupdesc_id; /* last-seen tupdesc identifier */
214 } PLpgSQL_type;
215 
216 /*
217  * SQL Query to plan and execute
218  */
219 typedef struct PLpgSQL_expr
220 {
221  char *query;
223  Bitmapset *paramnos; /* all dnos referenced by this query */
224  int rwparam; /* dno of read/write param, or -1 if none */
225 
226  /* function containing this expr (not set until we first parse query) */
228 
229  /* namespace chain visible to this expr */
231 
232  /* fields for "simple expression" fast-path execution: */
233  Expr *expr_simple_expr; /* NULL means not a simple expr */
234  Oid expr_simple_type; /* result type Oid, if simple */
235  int32 expr_simple_typmod; /* result typmod, if simple */
236  bool expr_simple_mutable; /* true if simple expr is mutable */
237 
238  /*
239  * If the expression was ever determined to be simple, we remember its
240  * CachedPlanSource and CachedPlan here. If expr_simple_plan_lxid matches
241  * current LXID, then we hold a refcount on expr_simple_plan in the
242  * current transaction. Otherwise we need to get one before re-using it.
243  */
244  CachedPlanSource *expr_simple_plansource; /* extracted from "plan" */
245  CachedPlan *expr_simple_plan; /* extracted from "plan" */
247 
248  /*
249  * if expr is simple AND prepared in current transaction,
250  * expr_simple_state and expr_simple_in_use are valid. Test validity by
251  * seeing if expr_simple_lxid matches current LXID. (If not,
252  * expr_simple_state probably points at garbage!)
253  */
254  ExprState *expr_simple_state; /* eval tree for expr_simple_expr */
255  bool expr_simple_in_use; /* true if eval tree is active */
257 } PLpgSQL_expr;
258 
259 /*
260  * Generic datum array item
261  *
262  * PLpgSQL_datum is the common supertype for PLpgSQL_var, PLpgSQL_row,
263  * PLpgSQL_rec, PLpgSQL_recfield, and PLpgSQL_arrayelem.
264  */
265 typedef struct PLpgSQL_datum
266 {
268  int dno;
269 } PLpgSQL_datum;
270 
271 /*
272  * Scalar or composite variable
273  *
274  * The variants PLpgSQL_var, PLpgSQL_row, and PLpgSQL_rec share these
275  * fields.
276  */
277 typedef struct PLpgSQL_variable
278 {
280  int dno;
281  char *refname;
282  int lineno;
283  bool isconst;
284  bool notnull;
287 
288 /*
289  * Scalar variable
290  *
291  * DTYPE_VAR and DTYPE_PROMISE datums both use this struct type.
292  * A PROMISE datum works exactly like a VAR datum for most purposes,
293  * but if it is read without having previously been assigned to, then
294  * a special "promised" value is computed and assigned to the datum
295  * before the read is performed. This technique avoids the overhead of
296  * computing the variable's value in cases where we expect that many
297  * functions will never read it.
298  */
299 typedef struct PLpgSQL_var
300 {
302  int dno;
303  char *refname;
304  int lineno;
305  bool isconst;
306  bool notnull;
308  /* end of PLpgSQL_variable fields */
309 
311 
312  /*
313  * Variables declared as CURSOR FOR <query> are mostly like ordinary
314  * scalar variables of type refcursor, but they have these additional
315  * properties:
316  */
320 
321  /* Fields below here can change at runtime */
322 
324  bool isnull;
325  bool freeval;
326 
327  /*
328  * The promise field records which "promised" value to assign if the
329  * promise must be honored. If it's a normal variable, or the promise has
330  * been fulfilled, this is PLPGSQL_PROMISE_NONE.
331  */
333 } PLpgSQL_var;
334 
335 /*
336  * Row variable - this represents one or more variables that are listed in an
337  * INTO clause, FOR-loop targetlist, cursor argument list, etc. We also use
338  * a row to represent a function's OUT parameters when there's more than one.
339  *
340  * Note that there's no way to name the row as such from PL/pgSQL code,
341  * so many functions don't need to support these.
342  *
343  * That also means that there's no real name for the row variable, so we
344  * conventionally set refname to "(unnamed row)". We could leave it NULL,
345  * but it's too convenient to be able to assume that refname is valid in
346  * all variants of PLpgSQL_variable.
347  *
348  * isconst, notnull, and default_val are unsupported (and hence
349  * always zero/null) for a row. The member variables of a row should have
350  * been checked to be writable at compile time, so isconst is correctly set
351  * to false. notnull and default_val aren't applicable.
352  */
353 typedef struct PLpgSQL_row
354 {
356  int dno;
357  char *refname;
358  int lineno;
359  bool isconst;
360  bool notnull;
362  /* end of PLpgSQL_variable fields */
363 
364  /*
365  * rowtupdesc is only set up if we might need to convert the row into a
366  * composite datum, which currently only happens for OUT parameters.
367  * Otherwise it is NULL.
368  */
370 
371  int nfields;
372  char **fieldnames;
373  int *varnos;
374 } PLpgSQL_row;
375 
376 /*
377  * Record variable (any composite type, including RECORD)
378  */
379 typedef struct PLpgSQL_rec
380 {
382  int dno;
383  char *refname;
384  int lineno;
385  bool isconst;
386  bool notnull;
388  /* end of PLpgSQL_variable fields */
389 
390  /*
391  * Note: for non-RECORD cases, we may from time to time re-look-up the
392  * composite type, using datatype->origtypname. That can result in
393  * changing rectypeid.
394  */
395 
396  PLpgSQL_type *datatype; /* can be NULL, if rectypeid is RECORDOID */
397  Oid rectypeid; /* declared type of variable */
398  /* RECFIELDs for this record are chained together for easy access */
399  int firstfield; /* dno of first RECFIELD, or -1 if none */
400 
401  /* Fields below here can change at runtime */
402 
403  /* We always store record variables as "expanded" records */
405 } PLpgSQL_rec;
406 
407 /*
408  * Field in record
409  */
410 typedef struct PLpgSQL_recfield
411 {
413  int dno;
414  /* end of PLpgSQL_datum fields */
415 
416  char *fieldname; /* name of field */
417  int recparentno; /* dno of parent record */
418  int nextfield; /* dno of next child, or -1 if none */
419  uint64 rectupledescid; /* record's tupledesc ID as of last lookup */
420  ExpandedRecordFieldInfo finfo; /* field's attnum and type info */
421  /* if rectupledescid == INVALID_TUPLEDESC_IDENTIFIER, finfo isn't valid */
423 
424 /*
425  * Element of array variable
426  */
427 typedef struct PLpgSQL_arrayelem
428 {
430  int dno;
431  /* end of PLpgSQL_datum fields */
432 
434  int arrayparentno; /* dno of parent array variable */
435 
436  /* Remaining fields are cached info about the array variable's type */
437  Oid parenttypoid; /* type of array variable; 0 if not yet set */
438  int32 parenttypmod; /* typmod of array variable */
439  Oid arraytypoid; /* OID of actual array type */
440  int32 arraytypmod; /* typmod of array (and its elements too) */
441  int16 arraytyplen; /* typlen of array type */
442  Oid elemtypoid; /* OID of array element type */
443  int16 elemtyplen; /* typlen of element type */
444  bool elemtypbyval; /* element type is pass-by-value? */
445  char elemtypalign; /* typalign of element type */
447 
448 /*
449  * Item in the compilers namespace tree
450  */
451 typedef struct PLpgSQL_nsitem
452 {
454 
455  /*
456  * For labels, itemno is a value of enum PLpgSQL_label_type. For other
457  * itemtypes, itemno is the associated PLpgSQL_datum's dno.
458  */
459  int itemno;
461  char name[FLEXIBLE_ARRAY_MEMBER]; /* nul-terminated string */
463 
464 /*
465  * Generic execution node
466  */
467 typedef struct PLpgSQL_stmt
468 {
470  int lineno;
471 
472  /*
473  * Unique statement ID in this function (starting at 1; 0 is invalid/not
474  * set). This can be used by a profiler as the index for an array of
475  * per-statement metrics.
476  */
477  unsigned int stmtid;
478 } PLpgSQL_stmt;
479 
480 /*
481  * One EXCEPTION condition name
482  */
483 typedef struct PLpgSQL_condition
484 {
485  int sqlerrstate; /* SQLSTATE code */
486  char *condname; /* condition name (for debugging) */
489 
490 /*
491  * EXCEPTION block
492  */
494 {
497  List *exc_list; /* List of WHEN clauses */
499 
500 /*
501  * One EXCEPTION ... WHEN clause
502  */
503 typedef struct PLpgSQL_exception
504 {
505  int lineno;
507  List *action; /* List of statements */
509 
510 /*
511  * Block of statements
512  */
513 typedef struct PLpgSQL_stmt_block
514 {
516  int lineno;
517  unsigned int stmtid;
518  char *label;
519  List *body; /* List of statements */
520  int n_initvars; /* Length of initvarnos[] */
521  int *initvarnos; /* dnos of variables declared in this block */
524 
525 /*
526  * Assign statement
527  */
528 typedef struct PLpgSQL_stmt_assign
529 {
531  int lineno;
532  unsigned int stmtid;
533  int varno;
536 
537 /*
538  * PERFORM statement
539  */
540 typedef struct PLpgSQL_stmt_perform
541 {
543  int lineno;
544  unsigned int stmtid;
547 
548 /*
549  * CALL statement
550  */
551 typedef struct PLpgSQL_stmt_call
552 {
554  int lineno;
555  unsigned int stmtid;
557  bool is_call;
560 
561 /*
562  * COMMIT statement
563  */
564 typedef struct PLpgSQL_stmt_commit
565 {
567  int lineno;
568  unsigned int stmtid;
569  bool chain;
571 
572 /*
573  * ROLLBACK statement
574  */
575 typedef struct PLpgSQL_stmt_rollback
576 {
578  int lineno;
579  unsigned int stmtid;
580  bool chain;
582 
583 /*
584  * SET statement
585  */
586 typedef struct PLpgSQL_stmt_set
587 {
589  int lineno;
590  unsigned int stmtid;
593 
594 /*
595  * GET DIAGNOSTICS item
596  */
597 typedef struct PLpgSQL_diag_item
598 {
599  PLpgSQL_getdiag_kind kind; /* id for diagnostic value desired */
600  int target; /* where to assign it */
602 
603 /*
604  * GET DIAGNOSTICS statement
605  */
606 typedef struct PLpgSQL_stmt_getdiag
607 {
609  int lineno;
610  unsigned int stmtid;
611  bool is_stacked; /* STACKED or CURRENT diagnostics area? */
612  List *diag_items; /* List of PLpgSQL_diag_item */
614 
615 /*
616  * IF statement
617  */
618 typedef struct PLpgSQL_stmt_if
619 {
621  int lineno;
622  unsigned int stmtid;
623  PLpgSQL_expr *cond; /* boolean expression for THEN */
624  List *then_body; /* List of statements */
625  List *elsif_list; /* List of PLpgSQL_if_elsif structs */
626  List *else_body; /* List of statements */
628 
629 /*
630  * one ELSIF arm of IF statement
631  */
632 typedef struct PLpgSQL_if_elsif
633 {
634  int lineno;
635  PLpgSQL_expr *cond; /* boolean expression for this case */
636  List *stmts; /* List of statements */
638 
639 /*
640  * CASE statement
641  */
642 typedef struct PLpgSQL_stmt_case
643 {
645  int lineno;
646  unsigned int stmtid;
647  PLpgSQL_expr *t_expr; /* test expression, or NULL if none */
648  int t_varno; /* var to store test expression value into */
649  List *case_when_list; /* List of PLpgSQL_case_when structs */
650  bool have_else; /* flag needed because list could be empty */
651  List *else_stmts; /* List of statements */
653 
654 /*
655  * one arm of CASE statement
656  */
657 typedef struct PLpgSQL_case_when
658 {
659  int lineno;
660  PLpgSQL_expr *expr; /* boolean expression for this case */
661  List *stmts; /* List of statements */
663 
664 /*
665  * Unconditional LOOP statement
666  */
667 typedef struct PLpgSQL_stmt_loop
668 {
670  int lineno;
671  unsigned int stmtid;
672  char *label;
673  List *body; /* List of statements */
675 
676 /*
677  * WHILE cond LOOP statement
678  */
679 typedef struct PLpgSQL_stmt_while
680 {
682  int lineno;
683  unsigned int stmtid;
684  char *label;
686  List *body; /* List of statements */
688 
689 /*
690  * FOR statement with integer loopvar
691  */
692 typedef struct PLpgSQL_stmt_fori
693 {
695  int lineno;
696  unsigned int stmtid;
697  char *label;
701  PLpgSQL_expr *step; /* NULL means default (ie, BY 1) */
702  int reverse;
703  List *body; /* List of statements */
705 
706 /*
707  * PLpgSQL_stmt_forq represents a FOR statement running over a SQL query.
708  * It is the common supertype of PLpgSQL_stmt_fors, PLpgSQL_stmt_forc
709  * and PLpgSQL_stmt_dynfors.
710  */
711 typedef struct PLpgSQL_stmt_forq
712 {
714  int lineno;
715  unsigned int stmtid;
716  char *label;
717  PLpgSQL_variable *var; /* Loop variable (record or row) */
718  List *body; /* List of statements */
720 
721 /*
722  * FOR statement running over SELECT
723  */
724 typedef struct PLpgSQL_stmt_fors
725 {
727  int lineno;
728  unsigned int stmtid;
729  char *label;
730  PLpgSQL_variable *var; /* Loop variable (record or row) */
731  List *body; /* List of statements */
732  /* end of fields that must match PLpgSQL_stmt_forq */
735 
736 /*
737  * FOR statement running over cursor
738  */
739 typedef struct PLpgSQL_stmt_forc
740 {
742  int lineno;
743  unsigned int stmtid;
744  char *label;
745  PLpgSQL_variable *var; /* Loop variable (record or row) */
746  List *body; /* List of statements */
747  /* end of fields that must match PLpgSQL_stmt_forq */
748  int curvar;
749  PLpgSQL_expr *argquery; /* cursor arguments if any */
751 
752 /*
753  * FOR statement running over EXECUTE
754  */
755 typedef struct PLpgSQL_stmt_dynfors
756 {
758  int lineno;
759  unsigned int stmtid;
760  char *label;
761  PLpgSQL_variable *var; /* Loop variable (record or row) */
762  List *body; /* List of statements */
763  /* end of fields that must match PLpgSQL_stmt_forq */
765  List *params; /* USING expressions */
767 
768 /*
769  * FOREACH item in array loop
770  */
772 {
774  int lineno;
775  unsigned int stmtid;
776  char *label;
777  int varno; /* loop target variable */
778  int slice; /* slice dimension, or 0 */
779  PLpgSQL_expr *expr; /* array expression */
780  List *body; /* List of statements */
782 
783 /*
784  * OPEN a curvar
785  */
786 typedef struct PLpgSQL_stmt_open
787 {
789  int lineno;
790  unsigned int stmtid;
791  int curvar;
796  List *params; /* USING expressions */
798 
799 /*
800  * FETCH or MOVE statement
801  */
802 typedef struct PLpgSQL_stmt_fetch
803 {
805  int lineno;
806  unsigned int stmtid;
807  PLpgSQL_variable *target; /* target (record or row) */
808  int curvar; /* cursor variable to fetch from */
809  FetchDirection direction; /* fetch direction */
810  long how_many; /* count, if constant (expr is NULL) */
811  PLpgSQL_expr *expr; /* count, if expression */
812  bool is_move; /* is this a fetch or move? */
813  bool returns_multiple_rows; /* can return more than one row? */
815 
816 /*
817  * CLOSE curvar
818  */
819 typedef struct PLpgSQL_stmt_close
820 {
822  int lineno;
823  unsigned int stmtid;
824  int curvar;
826 
827 /*
828  * EXIT or CONTINUE statement
829  */
830 typedef struct PLpgSQL_stmt_exit
831 {
833  int lineno;
834  unsigned int stmtid;
835  bool is_exit; /* Is this an exit or a continue? */
836  char *label; /* NULL if it's an unlabeled EXIT/CONTINUE */
839 
840 /*
841  * RETURN statement
842  */
843 typedef struct PLpgSQL_stmt_return
844 {
846  int lineno;
847  unsigned int stmtid;
849  int retvarno;
851 
852 /*
853  * RETURN NEXT statement
854  */
856 {
858  int lineno;
859  unsigned int stmtid;
861  int retvarno;
863 
864 /*
865  * RETURN QUERY statement
866  */
868 {
870  int lineno;
871  unsigned int stmtid;
872  PLpgSQL_expr *query; /* if static query */
873  PLpgSQL_expr *dynquery; /* if dynamic query (RETURN QUERY EXECUTE) */
874  List *params; /* USING arguments for dynamic query */
876 
877 /*
878  * RAISE statement
879  */
880 typedef struct PLpgSQL_stmt_raise
881 {
883  int lineno;
884  unsigned int stmtid;
886  char *condname; /* condition name, SQLSTATE, or NULL */
887  char *message; /* old-style message format literal, or NULL */
888  List *params; /* list of expressions for old-style message */
889  List *options; /* list of PLpgSQL_raise_option */
891 
892 /*
893  * RAISE statement option
894  */
895 typedef struct PLpgSQL_raise_option
896 {
900 
901 /*
902  * ASSERT statement
903  */
904 typedef struct PLpgSQL_stmt_assert
905 {
907  int lineno;
908  unsigned int stmtid;
912 
913 /*
914  * Generic SQL statement to execute
915  */
916 typedef struct PLpgSQL_stmt_execsql
917 {
919  int lineno;
920  unsigned int stmtid;
922  bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE? Note:
923  * mod_stmt is set when we plan the query */
924  bool into; /* INTO supplied? */
925  bool strict; /* INTO STRICT flag */
926  PLpgSQL_variable *target; /* INTO target (record or row) */
928 
929 /*
930  * Dynamic SQL string to execute
931  */
933 {
935  int lineno;
936  unsigned int stmtid;
937  PLpgSQL_expr *query; /* string expression */
938  bool into; /* INTO supplied? */
939  bool strict; /* INTO STRICT flag */
940  PLpgSQL_variable *target; /* INTO target (record or row) */
941  List *params; /* USING expressions */
943 
944 /*
945  * Hash lookup key for functions
946  */
947 typedef struct PLpgSQL_func_hashkey
948 {
950 
951  bool isTrigger; /* true if called as a DML trigger */
952  bool isEventTrigger; /* true if called as an event trigger */
953 
954  /* be careful that pad bytes in this struct get zeroed! */
955 
956  /*
957  * For a trigger function, the OID of the trigger is part of the hash key
958  * --- we want to compile the trigger function separately for each trigger
959  * it is used with, in case the rowtype or transition table names are
960  * different. Zero if not called as a DML trigger.
961  */
963 
964  /*
965  * We must include the input collation as part of the hash key too,
966  * because we have to generate different plans (with different Param
967  * collations) for different collation settings.
968  */
970 
971  /*
972  * We include actual argument types in the hash key to support polymorphic
973  * PLpgSQL functions. Be careful that extra positions are zeroed!
974  */
975  Oid argtypes[FUNC_MAX_ARGS];
977 
978 /*
979  * Trigger type
980  */
981 typedef enum PLpgSQL_trigtype
982 {
987 
988 /*
989  * Complete compiled function
990  */
991 typedef struct PLpgSQL_function
992 {
999  PLpgSQL_func_hashkey *fn_hashkey; /* back-link to hashtable key */
1001 
1010 
1012  int fn_argvarnos[FUNC_MAX_ARGS];
1017 
1019 
1021 
1022  /* extra checks */
1025 
1026  /* count of statements inside function */
1027  unsigned int nstatements;
1028 
1029  /* the datums representing the function's local variables */
1030  int ndatums;
1032  Size copiable_size; /* space for locally instantiated datums */
1033 
1034  /* function body parsetree */
1036 
1037  /* these fields change when the function is used */
1039  unsigned long use_count;
1041 
1042 /*
1043  * Runtime execution data
1044  */
1045 typedef struct PLpgSQL_execstate
1046 {
1047  PLpgSQL_function *func; /* function being executed */
1048 
1049  TriggerData *trigdata; /* if regular trigger, data about firing */
1050  EventTriggerData *evtrigdata; /* if event trigger, data about firing */
1051 
1054  Oid rettype; /* type of current retval */
1055 
1056  Oid fn_rettype; /* info about declared function rettype */
1058  bool retisset;
1059 
1061  bool atomic;
1062 
1063  char *exitlabel; /* the "target" label of the current EXIT or
1064  * CONTINUE stmt, if any */
1065  ErrorData *cur_error; /* current exception handler's error */
1066 
1067  Tuplestorestate *tuple_store; /* SRFs accumulate results here */
1068  TupleDesc tuple_store_desc; /* descriptor for tuples in tuple_store */
1072 
1074 
1075  /*
1076  * The datums representing the function's local variables. Some of these
1077  * are local storage in this execstate, but some just point to the shared
1078  * copy belonging to the PLpgSQL_function, depending on whether or not we
1079  * need any per-execution state for the datum's dtype.
1080  */
1081  int ndatums;
1083  /* context containing variable values (same as func's SPI_proc context) */
1085 
1086  /*
1087  * paramLI is what we use to pass local variable values to the executor.
1088  * It does not have a ParamExternData array; we just dynamically
1089  * instantiate parameter data as needed. By convention, PARAM_EXTERN
1090  * Params have paramid equal to the dno of the referenced local variable.
1091  */
1093 
1094  /* EState and resowner to use for "simple" expression evaluation */
1097 
1098  /* lookup table to use for executing type casts */
1101 
1102  /* memory context for statement-lifespan temporary values */
1103  MemoryContext stmt_mcontext; /* current stmt context, or NULL if none */
1104  MemoryContext stmt_mcontext_parent; /* parent of current context */
1105 
1106  /* temporary state for results from evaluation of query or expr */
1109  ExprContext *eval_econtext; /* for executing simple expressions */
1110 
1111  /* status information for error context reporting */
1112  PLpgSQL_stmt *err_stmt; /* current stmt */
1113  const char *err_text; /* additional state info */
1114 
1115  void *plugin_info; /* reserved for use by optional plugin */
1117 
1118 /*
1119  * A PLpgSQL_plugin structure represents an instrumentation plugin.
1120  * To instrument PL/pgSQL, a plugin library must access the rendezvous
1121  * variable "PLpgSQL_plugin" and set it to point to a PLpgSQL_plugin struct.
1122  * Typically the struct could just be static data in the plugin library.
1123  * We expect that a plugin would do this at library load time (_PG_init()).
1124  * It must also be careful to set the rendezvous variable back to NULL
1125  * if it is unloaded (_PG_fini()).
1126  *
1127  * This structure is basically a collection of function pointers --- at
1128  * various interesting points in pl_exec.c, we call these functions
1129  * (if the pointers are non-NULL) to give the plugin a chance to watch
1130  * what we are doing.
1131  *
1132  * func_setup is called when we start a function, before we've initialized
1133  * the local variables defined by the function.
1134  *
1135  * func_beg is called when we start a function, after we've initialized
1136  * the local variables.
1137  *
1138  * func_end is called at the end of a function.
1139  *
1140  * stmt_beg and stmt_end are called before and after (respectively) each
1141  * statement.
1142  *
1143  * Also, immediately before any call to func_setup, PL/pgSQL fills in the
1144  * error_callback and assign_expr fields with pointers to its own
1145  * plpgsql_exec_error_callback and exec_assign_expr functions. This is
1146  * a somewhat ad-hoc expedient to simplify life for debugger plugins.
1147  */
1148 typedef struct PLpgSQL_plugin
1149 {
1150  /* Function pointers set up by the plugin */
1151  void (*func_setup) (PLpgSQL_execstate *estate, PLpgSQL_function *func);
1152  void (*func_beg) (PLpgSQL_execstate *estate, PLpgSQL_function *func);
1153  void (*func_end) (PLpgSQL_execstate *estate, PLpgSQL_function *func);
1154  void (*stmt_beg) (PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt);
1155  void (*stmt_end) (PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt);
1156 
1157  /* Function pointers set by PL/pgSQL itself */
1158  void (*error_callback) (void *arg);
1159  void (*assign_expr) (PLpgSQL_execstate *estate, PLpgSQL_datum *target,
1160  PLpgSQL_expr *expr);
1161 } PLpgSQL_plugin;
1162 
1163 /*
1164  * Struct types used during parsing
1165  */
1166 
1167 typedef struct PLword
1168 {
1169  char *ident; /* palloc'd converted identifier */
1170  bool quoted; /* Was it double-quoted? */
1171 } PLword;
1172 
1173 typedef struct PLcword
1174 {
1175  List *idents; /* composite identifiers (list of String) */
1176 } PLcword;
1177 
1178 typedef struct PLwdatum
1179 {
1180  PLpgSQL_datum *datum; /* referenced variable */
1181  char *ident; /* valid if simple name */
1182  bool quoted;
1183  List *idents; /* valid if composite name */
1184 } PLwdatum;
1185 
1186 /**********************************************************************
1187  * Global variable declarations
1188  **********************************************************************/
1189 
1190 typedef enum
1191 {
1192  IDENTIFIER_LOOKUP_NORMAL, /* normal processing of var names */
1193  IDENTIFIER_LOOKUP_DECLARE, /* In DECLARE --- don't look up names */
1194  IDENTIFIER_LOOKUP_EXPR /* In SQL expression --- special case */
1196 
1198 
1199 extern int plpgsql_variable_conflict;
1200 
1201 extern bool plpgsql_print_strict_params;
1202 
1203 extern bool plpgsql_check_asserts;
1204 
1205 /* extra compile-time and run-time checks */
1206 #define PLPGSQL_XCHECK_NONE 0
1207 #define PLPGSQL_XCHECK_SHADOWVAR (1 << 1)
1208 #define PLPGSQL_XCHECK_TOOMANYROWS (1 << 2)
1209 #define PLPGSQL_XCHECK_STRICTMULTIASSIGNMENT (1 << 3)
1210 #define PLPGSQL_XCHECK_ALL ((int) ~0)
1211 
1212 extern int plpgsql_extra_warnings;
1213 extern int plpgsql_extra_errors;
1214 
1215 extern bool plpgsql_check_syntax;
1216 extern bool plpgsql_DumpExecTree;
1217 
1219 
1220 extern int plpgsql_nDatums;
1221 extern PLpgSQL_datum **plpgsql_Datums;
1222 
1223 extern char *plpgsql_error_funcname;
1224 
1227 
1229 
1230 /**********************************************************************
1231  * Function declarations
1232  **********************************************************************/
1233 
1234 /*
1235  * Functions in pl_comp.c
1236  */
1238  bool forValidator);
1239 extern PLpgSQL_function *plpgsql_compile_inline(char *proc_source);
1240 extern void plpgsql_parser_setup(struct ParseState *pstate,
1241  PLpgSQL_expr *expr);
1242 extern bool plpgsql_parse_word(char *word1, const char *yytxt, bool lookup,
1243  PLwdatum *wdatum, PLword *word);
1244 extern bool plpgsql_parse_dblword(char *word1, char *word2,
1245  PLwdatum *wdatum, PLcword *cword);
1246 extern bool plpgsql_parse_tripword(char *word1, char *word2, char *word3,
1247  PLwdatum *wdatum, PLcword *cword);
1248 extern PLpgSQL_type *plpgsql_parse_wordtype(char *ident);
1249 extern PLpgSQL_type *plpgsql_parse_cwordtype(List *idents);
1250 extern PLpgSQL_type *plpgsql_parse_wordrowtype(char *ident);
1252 extern PLpgSQL_type *plpgsql_build_datatype(Oid typeOid, int32 typmod,
1253  Oid collation,
1255 extern PLpgSQL_variable *plpgsql_build_variable(const char *refname, int lineno,
1256  PLpgSQL_type *dtype,
1257  bool add2namespace);
1258 extern PLpgSQL_rec *plpgsql_build_record(const char *refname, int lineno,
1259  PLpgSQL_type *dtype, Oid rectypeid,
1260  bool add2namespace);
1262  const char *fldname);
1263 extern int plpgsql_recognize_err_condition(const char *condname,
1264  bool allow_sqlstate);
1265 extern PLpgSQL_condition *plpgsql_parse_err_condition(char *condname);
1266 extern void plpgsql_adddatum(PLpgSQL_datum *newdatum);
1267 extern int plpgsql_add_initdatums(int **varnos);
1268 extern void plpgsql_HashTableInit(void);
1269 
1270 /*
1271  * Functions in pl_handler.c
1272  */
1273 extern void _PG_init(void);
1274 
1275 /*
1276  * Functions in pl_exec.c
1277  */
1279  FunctionCallInfo fcinfo,
1280  EState *simple_eval_estate,
1281  ResourceOwner simple_eval_resowner,
1282  bool atomic);
1284  TriggerData *trigdata);
1286  EventTriggerData *trigdata);
1287 extern void plpgsql_xact_cb(XactEvent event, void *arg);
1288 extern void plpgsql_subxact_cb(SubXactEvent event, SubTransactionId mySubid,
1289  SubTransactionId parentSubid, void *arg);
1291  PLpgSQL_datum *datum);
1293  PLpgSQL_datum *datum,
1294  Oid *typeId, int32 *typMod,
1295  Oid *collation);
1296 
1297 /*
1298  * Functions for namespace handling in pl_funcs.c
1299  */
1300 extern void plpgsql_ns_init(void);
1301 extern void plpgsql_ns_push(const char *label,
1302  PLpgSQL_label_type label_type);
1303 extern void plpgsql_ns_pop(void);
1304 extern PLpgSQL_nsitem *plpgsql_ns_top(void);
1305 extern void plpgsql_ns_additem(PLpgSQL_nsitem_type itemtype, int itemno, const char *name);
1306 extern PLpgSQL_nsitem *plpgsql_ns_lookup(PLpgSQL_nsitem *ns_cur, bool localmode,
1307  const char *name1, const char *name2,
1308  const char *name3, int *names_used);
1310  const char *name);
1312 
1313 /*
1314  * Other functions in pl_funcs.c
1315  */
1316 extern const char *plpgsql_stmt_typename(PLpgSQL_stmt *stmt);
1317 extern const char *plpgsql_getdiag_kindname(PLpgSQL_getdiag_kind kind);
1319 extern void plpgsql_dumptree(PLpgSQL_function *func);
1320 
1321 /*
1322  * Scanner functions in pl_scanner.c
1323  */
1324 extern int plpgsql_base_yylex(void);
1325 extern int plpgsql_yylex(void);
1326 extern void plpgsql_push_back_token(int token);
1327 extern bool plpgsql_token_is_unreserved_keyword(int token);
1329  int startlocation, int endlocation);
1330 extern int plpgsql_peek(void);
1331 extern void plpgsql_peek2(int *tok1_p, int *tok2_p, int *tok1_loc,
1332  int *tok2_loc);
1333 extern int plpgsql_scanner_errposition(int location);
1334 extern void plpgsql_yyerror(const char *message) pg_attribute_noreturn();
1335 extern int plpgsql_location_to_lineno(int location);
1336 extern int plpgsql_latest_lineno(void);
1337 extern void plpgsql_scanner_init(const char *str);
1338 extern void plpgsql_scanner_finish(void);
1339 
1340 /*
1341  * Externs in gram.y
1342  */
1343 extern int plpgsql_yyparse(void);
1344 
1345 #endif /* PLPGSQL_H */
int plpgsql_nDatums
Definition: pl_comp.c:44
PLpgSQL_promise_type promise
Definition: plpgsql.h:332
PLpgSQL_nsitem * plpgsql_ns_top(void)
Definition: pl_funcs.c:81
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:788
signed short int16
Definition: c.h:362
int plpgsql_yyparse(void)
PLpgSQL_datum_type dtype
Definition: plpgsql.h:381
PLpgSQL_raise_option_type
Definition: plpgsql.h:168
int16 elemtyplen
Definition: plpgsql.h:443
int plpgsql_extra_warnings
Definition: pl_handler.c:52
HTAB * cast_hash
Definition: plpgsql.h:1099
unsigned int stmtid
Definition: plpgsql.h:806
XactEvent
Definition: xact.h:113
#define pg_attribute_noreturn()
Definition: c.h:146
struct PLpgSQL_stmt_dynexecute PLpgSQL_stmt_dynexecute
PLpgSQL_expr * query
Definition: plpgsql.h:937
struct PLpgSQL_stmt_forq PLpgSQL_stmt_forq
bool print_strict_params
Definition: plpgsql.h:1020
PLpgSQL_datum ** datums
Definition: plpgsql.h:1031
struct PLpgSQL_stmt_block PLpgSQL_stmt_block
PLpgSQL_expr * cond
Definition: plpgsql.h:623
unsigned int stmtid
Definition: plpgsql.h:532
PLpgSQL_expr * cond
Definition: plpgsql.h:685
unsigned int stmtid
Definition: plpgsql.h:579
PLpgSQL_nsitem * plpgsql_ns_find_nearest_loop(PLpgSQL_nsitem *ns_cur)
Definition: pl_funcs.c:214
struct PLpgSQL_stmt_return_query PLpgSQL_stmt_return_query
List * then_body
Definition: plpgsql.h:624
PLpgSQL_expr * expr
Definition: plpgsql.h:779
PLpgSQL_func_hashkey * fn_hashkey
Definition: plpgsql.h:999
char * refname
Definition: plpgsql.h:357
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:694
ItemPointerData fn_tid
Definition: plpgsql.h:996
unsigned int nstatements
Definition: plpgsql.h:1027
TypeCacheEntry * tcache
Definition: plpgsql.h:212
struct PLpgSQL_stmt_raise PLpgSQL_stmt_raise
char * query
Definition: plpgsql.h:221
unsigned int stmtid
Definition: plpgsql.h:728
struct PLpgSQL_stmt_fori PLpgSQL_stmt_fori
SPITupleTable * eval_tuptable
Definition: plpgsql.h:1107
FetchDirection direction
Definition: plpgsql.h:809
struct PLpgSQL_stmt_getdiag PLpgSQL_stmt_getdiag
FetchDirection
Definition: parsenodes.h:2742
int lineno
Definition: plpgsql.h:470
PLpgSQL_function * plpgsql_compile_inline(char *proc_source)
Definition: pl_comp.c:844
unsigned int stmtid
Definition: plpgsql.h:759
PLpgSQL_plugin ** plpgsql_plugin_ptr
Definition: pl_handler.c:56
char * refname
Definition: plpgsql.h:303
struct PLpgSQL_execstate PLpgSQL_execstate
ResourceOwner simple_eval_resowner
Definition: plpgsql.h:1096
struct PLpgSQL_stmt_call PLpgSQL_stmt_call
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:741
uint64 eval_processed
Definition: plpgsql.h:1108
struct PLpgSQL_stmt_commit PLpgSQL_stmt_commit
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:620
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:530
uint32 TransactionId
Definition: c.h:521
unsigned int stmtid
Definition: plpgsql.h:847
PLpgSQL_expr * expr
Definition: plpgsql.h:848
List * elsif_list
Definition: plpgsql.h:625
PLpgSQL_type * datatype
Definition: plpgsql.h:396
PLpgSQL_stmt * err_stmt
Definition: plpgsql.h:1112
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:713
PLpgSQL_datum_type dtype
Definition: plpgsql.h:301
int plpgsql_recognize_err_condition(const char *condname, bool allow_sqlstate)
Definition: pl_comp.c:2206
unsigned int stmtid
Definition: plpgsql.h:696
TypeName * origtypname
Definition: plpgsql.h:211
PLpgSQL_stmt_block * action
Definition: plpgsql.h:1035
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:566
PLpgSQL_type * plpgsql_parse_cwordtype(List *idents)
Definition: pl_comp.c:1659
void plpgsql_peek2(int *tok1_p, int *tok2_p, int *tok1_loc, int *tok2_loc)
Definition: pl_scanner.c:439
TriggerData * trigdata
Definition: plpgsql.h:1049
void plpgsql_append_source_text(StringInfo buf, int startlocation, int endlocation)
Definition: pl_scanner.c:404
PLpgSQL_expr * default_val
Definition: plpgsql.h:285
unsigned int stmtid
Definition: plpgsql.h:859
PLpgSQL_expr * cursor_explicit_expr
Definition: plpgsql.h:317
List * stmts
Definition: plpgsql.h:636
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:553
PLpgSQL_variable * var
Definition: plpgsql.h:745
ResourceOwner tuple_store_owner
Definition: plpgsql.h:1070
IdentifierLookup
Definition: plpgsql.h:1190
PLpgSQL_rec * plpgsql_build_record(const char *refname, int lineno, PLpgSQL_type *dtype, Oid rectypeid, bool add2namespace)
Definition: pl_comp.c:1927
unsigned int stmtid
Definition: plpgsql.h:920
struct PLpgSQL_plugin PLpgSQL_plugin
struct PLpgSQL_stmt PLpgSQL_stmt
int plpgsql_base_yylex(void)
PLpgSQL_datum ** plpgsql_Datums
Definition: pl_comp.c:45
char * condname
Definition: plpgsql.h:486
PLpgSQL_type * datatype
Definition: plpgsql.h:310
PLpgSQL_datum_type
Definition: plpgsql.h:61
PLpgSQL_type * plpgsql_parse_wordtype(char *ident)
Definition: pl_comp.c:1593
struct PLpgSQL_stmt_exit PLpgSQL_stmt_exit
void plpgsql_subxact_cb(SubXactEvent event, SubTransactionId mySubid, SubTransactionId parentSubid, void *arg)
Definition: pl_exec.c:8564
PLpgSQL_datum_type dtype
Definition: plpgsql.h:429
PLpgSQL_type_type ttype
Definition: plpgsql.h:203
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:918
struct PLpgSQL_variable PLpgSQL_variable
bool isconst
Definition: plpgsql.h:305
TransactionId fn_xmin
Definition: plpgsql.h:995
#define FLEXIBLE_ARRAY_MEMBER
Definition: c.h:284
MemoryContext cast_hash_context
Definition: plpgsql.h:1100
ExpandedRecordHeader * erh
Definition: plpgsql.h:404
PLpgSQL_expr * sqlstmt
Definition: plpgsql.h:921
struct PLpgSQL_condition * next
Definition: plpgsql.h:487
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:608
bool plpgsql_check_asserts
Definition: pl_handler.c:48
PLpgSQL_type * plpgsql_parse_wordrowtype(char *ident)
Definition: pl_comp.c:1779
uint64 tupdesc_id
Definition: plpgsql.h:213
struct PLpgSQL_stmt_dynfors PLpgSQL_stmt_dynfors
struct PLpgSQL_stmt_set PLpgSQL_stmt_set
PLpgSQL_expr * dynquery
Definition: plpgsql.h:795
PLpgSQL_recfield * plpgsql_build_recfield(PLpgSQL_rec *rec, const char *fldname)
Definition: pl_comp.c:2021
uint32 SubTransactionId
Definition: c.h:525
unsigned int stmtid
Definition: plpgsql.h:743
struct PLpgSQL_exception PLpgSQL_exception
void * plugin_info
Definition: plpgsql.h:1115
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:577
PLpgSQL_function * func
Definition: plpgsql.h:1047
PLpgSQL_expr * expr
Definition: plpgsql.h:545
PLpgSQL_expr * cond
Definition: plpgsql.h:635
unsigned int stmtid
Definition: plpgsql.h:823
char * ident
Definition: plpgsql.h:1169
unsigned int Oid
Definition: postgres_ext.h:31
void plpgsql_ns_additem(PLpgSQL_nsitem_type itemtype, int itemno, const char *name)
Definition: pl_funcs.c:92
int plpgsql_scanner_errposition(int location)
Definition: pl_scanner.c:472
unsigned int stmtid
Definition: plpgsql.h:683
struct PLpgSQL_type PLpgSQL_type
List * else_stmts
Definition: plpgsql.h:651
PLpgSQL_datum_type dtype
Definition: plpgsql.h:267
struct PLpgSQL_var PLpgSQL_var
char * refname
Definition: plpgsql.h:383
PLpgSQL_expr * lower
Definition: plpgsql.h:699
IdentifierLookup plpgsql_IdentifierLookup
Definition: pl_scanner.c:26
bool plpgsql_print_strict_params
Definition: pl_handler.c:46
int plpgsql_latest_lineno(void)
Definition: pl_scanner.c:572
PLpgSQL_getdiag_kind kind
Definition: plpgsql.h:599
SPIPlanPtr plan
Definition: plpgsql.h:222
unsigned int stmtid
Definition: plpgsql.h:671
signed int int32
Definition: c.h:363
PLpgSQL_raise_option_type opt_type
Definition: plpgsql.h:897
PLpgSQL_datum ** datums
Definition: plpgsql.h:1082
int32 arraytypmod
Definition: plpgsql.h:440
unsigned int stmtid
Definition: plpgsql.h:871
PLpgSQL_resolve_option resolve_option
Definition: plpgsql.h:1018
struct PLpgSQL_stmt_close PLpgSQL_stmt_close
PLpgSQL_expr * query
Definition: plpgsql.h:872
#define FUNC_MAX_ARGS
Datum plpgsql_exec_function(PLpgSQL_function *func, FunctionCallInfo fcinfo, EState *simple_eval_estate, ResourceOwner simple_eval_resowner, bool atomic)
Definition: pl_exec.c:467
struct PLpgSQL_stmt_fors PLpgSQL_stmt_fors
bool notnull
Definition: plpgsql.h:306
struct PLpgSQL_stmt_forc PLpgSQL_stmt_forc
void plpgsql_parser_setup(struct ParseState *pstate, PLpgSQL_expr *expr)
Definition: pl_comp.c:1075
void plpgsql_free_function_memory(PLpgSQL_function *func)
Definition: pl_funcs.c:737
Definition: dynahash.c:218
char * plpgsql_error_funcname
Definition: pl_comp.c:48
int cursor_explicit_argrow
Definition: plpgsql.h:318
Bitmapset * paramnos
Definition: plpgsql.h:223
TupleDesc tuple_store_desc
Definition: plpgsql.h:1068
PLpgSQL_expr * expr
Definition: plpgsql.h:591
unsigned int stmtid
Definition: plpgsql.h:646
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:681
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:934
ParamListInfo paramLI
Definition: plpgsql.h:1092
PLpgSQL_expr * expr
Definition: plpgsql.h:860
Oid plpgsql_exec_get_datum_type(PLpgSQL_execstate *estate, PLpgSQL_datum *datum)
Definition: pl_exec.c:5656
void plpgsql_scanner_init(const char *str)
Definition: pl_scanner.c:586
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:882
CachedPlanSource * expr_simple_plansource
Definition: plpgsql.h:244
MemoryContext tuple_store_cxt
Definition: plpgsql.h:1069
unsigned int stmtid
Definition: plpgsql.h:517
const char * plpgsql_getdiag_kindname(PLpgSQL_getdiag_kind kind)
Definition: pl_funcs.c:302
PLpgSQL_promise_type
Definition: plpgsql.h:74
PLpgSQL_var * var
Definition: plpgsql.h:698
char ** fieldnames
Definition: plpgsql.h:372
struct PLpgSQL_execstate * cur_estate
Definition: plpgsql.h:1038
EState * simple_eval_estate
Definition: plpgsql.h:1095
bool plpgsql_parse_word(char *word1, const char *yytxt, bool lookup, PLwdatum *wdatum, PLword *word)
Definition: pl_comp.c:1390
struct PLpgSQL_func_hashkey PLpgSQL_func_hashkey
void _PG_init(void)
Definition: auth_delay.c:56
struct PLpgSQL_stmt_while PLpgSQL_stmt_while
PLpgSQL_expr * message
Definition: plpgsql.h:910
PLpgSQL_variable * target
Definition: plpgsql.h:926
PLpgSQL_label_type
Definition: plpgsql.h:51
PLpgSQL_expr * default_val
Definition: plpgsql.h:307
unsigned long use_count
Definition: plpgsql.h:1039
int plpgsql_yylex(void)
Definition: pl_scanner.c:146
List * idents
Definition: plpgsql.h:1175
void plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate, PLpgSQL_datum *datum, Oid *typeId, int32 *typMod, Oid *collation)
Definition: pl_exec.c:5741
struct PLpgSQL_nsitem * ns
Definition: plpgsql.h:230
struct PLpgSQL_stmt_foreach_a PLpgSQL_stmt_foreach_a
static char * buf
Definition: pg_test_fsync.c:68
struct PLword PLword
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:906
void plpgsql_adddatum(PLpgSQL_datum *newdatum)
Definition: pl_comp.c:2310
PLpgSQL_variable * var
Definition: plpgsql.h:730
int cursor_options
Definition: plpgsql.h:319
struct PLpgSQL_stmt_return PLpgSQL_stmt_return
void plpgsql_push_back_token(int token)
Definition: pl_scanner.c:370
struct PLpgSQL_stmt_fetch PLpgSQL_stmt_fetch
Definition: zic.c:301
ReturnSetInfo * rsi
Definition: plpgsql.h:1071
Expr * expr_simple_expr
Definition: plpgsql.h:233
uint32 LocalTransactionId
Definition: c.h:523
MemoryContext fn_cxt
Definition: plpgsql.h:1000
struct PLpgSQL_arrayelem PLpgSQL_arrayelem
struct PLpgSQL_case_when PLpgSQL_case_when
List * idents
Definition: plpgsql.h:1183
PLpgSQL_expr * expr
Definition: plpgsql.h:660
List * case_when_list
Definition: plpgsql.h:649
PLpgSQL_function * plpgsql_curr_compile
Definition: pl_comp.c:52
bool freeval
Definition: plpgsql.h:325
Tuplestorestate * tuple_store
Definition: plpgsql.h:1067
PLpgSQL_expr * query
Definition: plpgsql.h:764
void plpgsql_yyerror(const char *message) pg_attribute_noreturn()
Definition: pl_scanner.c:499
unsigned int stmtid
Definition: plpgsql.h:622
int * varnos
Definition: plpgsql.h:373
bool fn_retisdomain
Definition: plpgsql.h:1006
uint64 rectupledescid
Definition: plpgsql.h:419
Oid fn_input_collation
Definition: plpgsql.h:998
const char * plpgsql_stmt_typename(PLpgSQL_stmt *stmt)
Definition: pl_funcs.c:232
bool typbyval
Definition: plpgsql.h:205
int rwparam
Definition: plpgsql.h:224
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:857
struct PLpgSQL_datum PLpgSQL_datum
Oid collation
Definition: plpgsql.h:207
unsigned int stmtid
Definition: plpgsql.h:908
PLpgSQL_expr * expr
Definition: plpgsql.h:556
unsigned int stmtid
Definition: plpgsql.h:590
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:832
ErrorData * cur_error
Definition: plpgsql.h:1065
SubXactEvent
Definition: xact.h:127
ExprState * expr_simple_state
Definition: plpgsql.h:254
void plpgsql_HashTableInit(void)
Definition: pl_comp.c:2563
bool expr_simple_mutable
Definition: plpgsql.h:236
MemoryContext stmt_mcontext_parent
Definition: plpgsql.h:1104
bool typisarray
Definition: plpgsql.h:208
PLpgSQL_stmt_type
Definition: plpgsql.h:103
struct PLpgSQL_exception_block PLpgSQL_exception_block
CachedPlan * expr_simple_plan
Definition: plpgsql.h:245
struct PLpgSQL_function PLpgSQL_function
uintptr_t Datum
Definition: postgres.h:367
struct PLpgSQL_rec PLpgSQL_rec
bool quoted
Definition: plpgsql.h:1170
PLpgSQL_getdiag_kind
Definition: plpgsql.h:149
ExpandedRecordFieldInfo finfo
Definition: plpgsql.h:420
int32 parenttypmod
Definition: plpgsql.h:438
static char * label
PLpgSQL_nsitem * plpgsql_ns_lookup(PLpgSQL_nsitem *ns_cur, bool localmode, const char *name1, const char *name2, const char *name3, int *names_used)
Definition: pl_funcs.c:130
PLpgSQL_datum_type dtype
Definition: plpgsql.h:412
EventTriggerData * evtrigdata
Definition: plpgsql.h:1050
PLpgSQL_expr * cond
Definition: plpgsql.h:837
LocalTransactionId expr_simple_lxid
Definition: plpgsql.h:256
const char * err_text
Definition: plpgsql.h:1113
struct PLpgSQL_recfield PLpgSQL_recfield
unsigned int stmtid
Definition: plpgsql.h:936
PLpgSQL_expr * query
Definition: plpgsql.h:794
struct PLpgSQL_stmt_if PLpgSQL_stmt_if
Datum value
Definition: plpgsql.h:323
unsigned int stmtid
Definition: plpgsql.h:884
bool isconst
Definition: plpgsql.h:385
struct PLpgSQL_function * func
Definition: plpgsql.h:227
PLpgSQL_variable * var
Definition: plpgsql.h:761
PLpgSQL_condition * conditions
Definition: plpgsql.h:506
PLpgSQL_trigtype fn_is_trigger
Definition: plpgsql.h:997
struct PLpgSQL_nsitem * prev
Definition: plpgsql.h:460
unsigned int stmtid
Definition: plpgsql.h:544
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:542
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:821
unsigned int stmtid
Definition: plpgsql.h:555
struct PLpgSQL_row PLpgSQL_row
int nfields
Definition: plpgsql.h:371
int lineno
Definition: plpgsql.h:304
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:515
void plpgsql_ns_init(void)
Definition: pl_funcs.c:43
bool plpgsql_parse_dblword(char *word1, char *word2, PLwdatum *wdatum, PLcword *cword)
Definition: pl_comp.c:1445
PLpgSQL_exception_block * exceptions
Definition: plpgsql.h:522
int16 arraytyplen
Definition: plpgsql.h:441
bool isconst
Definition: plpgsql.h:359
struct PLpgSQL_stmt_case PLpgSQL_stmt_case
struct PLpgSQL_stmt_perform PLpgSQL_stmt_perform
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:588
ExprContext * eval_econtext
Definition: plpgsql.h:1109
size_t Size
Definition: c.h:474
char * fn_signature
Definition: plpgsql.h:993
List * else_body
Definition: plpgsql.h:626
PLpgSQL_type_type
Definition: plpgsql.h:93
PLpgSQL_datum * datum
Definition: plpgsql.h:1180
char * typname
Definition: plpgsql.h:201
unsigned int stmtid
Definition: plpgsql.h:775
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:757
PLpgSQL_expr * step
Definition: plpgsql.h:701
PLpgSQL_expr * t_expr
Definition: plpgsql.h:647
char * refname
Definition: plpgsql.h:281
unsigned int stmtid
Definition: plpgsql.h:834
PLpgSQL_expr * dynquery
Definition: plpgsql.h:873
PLpgSQL_datum_type dtype
Definition: plpgsql.h:279
PLpgSQL_variable * var
Definition: plpgsql.h:717
PLpgSQL_expr * expr
Definition: plpgsql.h:811
bool plpgsql_DumpExecTree
Definition: pl_comp.c:49
const char * name
Definition: encode.c:561
unsigned int stmtid
Definition: plpgsql.h:568
PLpgSQL_expr * expr
Definition: plpgsql.h:534
static void word(struct vars *, int, struct state *, struct state *)
Definition: regcomp.c:1246
struct PLpgSQL_condition PLpgSQL_condition
PLpgSQL_expr * expr
Definition: plpgsql.h:898
MemoryContext datum_context
Definition: plpgsql.h:1084
char typtype
Definition: plpgsql.h:206
bool plpgsql_parse_tripword(char *word1, char *word2, char *word3, PLwdatum *wdatum, PLcword *cword)
Definition: pl_comp.c:1525
bool plpgsql_check_syntax
Definition: pl_comp.c:50
struct PLpgSQL_nsitem PLpgSQL_nsitem
struct PLpgSQL_raise_option PLpgSQL_raise_option
PLpgSQL_variable * plpgsql_build_variable(const char *refname, int lineno, PLpgSQL_type *dtype, bool add2namespace)
Definition: pl_comp.c:1864
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:669
PLpgSQL_type * plpgsql_build_datatype(Oid typeOid, int32 typmod, Oid collation, TypeName *origtypname)
Definition: pl_comp.c:2068
PLpgSQL_variable * target
Definition: plpgsql.h:558
bool quoted
Definition: plpgsql.h:1182
int32 expr_simple_typmod
Definition: plpgsql.h:235
char * ident
Definition: plpgsql.h:1181
PLpgSQL_nsitem * plpgsql_ns_lookup_label(PLpgSQL_nsitem *ns_cur, const char *name)
Definition: pl_funcs.c:195
struct PLpgSQL_stmt_assign PLpgSQL_stmt_assign
int32 atttypmod
Definition: plpgsql.h:209
unsigned int stmtid
Definition: plpgsql.h:790
PLpgSQL_expr * argquery
Definition: plpgsql.h:793
PLpgSQL_type * plpgsql_parse_cwordrowtype(List *idents)
Definition: pl_comp.c:1816
PLpgSQL_nsitem_type itemtype
Definition: plpgsql.h:453
struct PLpgSQL_stmt_execsql PLpgSQL_stmt_execsql
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:726
struct PLpgSQL_diag_item PLpgSQL_diag_item
TupleDesc rowtupdesc
Definition: plpgsql.h:369
PLpgSQL_expr * subscript
Definition: plpgsql.h:433
unsigned int stmtid
Definition: plpgsql.h:715
bool fn_retistuple
Definition: plpgsql.h:1005
PLpgSQL_expr * argquery
Definition: plpgsql.h:749
void plpgsql_ns_push(const char *label, PLpgSQL_label_type label_type)
Definition: pl_funcs.c:54
void * arg
MemoryContext stmt_mcontext
Definition: plpgsql.h:1103
PLpgSQL_trigtype
Definition: plpgsql.h:981
void plpgsql_exec_event_trigger(PLpgSQL_function *func, EventTriggerData *trigdata)
Definition: pl_exec.c:1141
PLpgSQL_expr * upper
Definition: plpgsql.h:700
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:469
PLpgSQL_resolve_option
Definition: plpgsql.h:184
struct PLwdatum PLwdatum
int plpgsql_location_to_lineno(int location)
Definition: pl_scanner.c:538
Size copiable_size
Definition: plpgsql.h:1032
struct PLpgSQL_stmt_assert PLpgSQL_stmt_assert
LocalTransactionId expr_simple_plan_lxid
Definition: plpgsql.h:246
bool expr_simple_in_use
Definition: plpgsql.h:255
struct PLpgSQL_if_elsif PLpgSQL_if_elsif
struct PLpgSQL_stmt_return_next PLpgSQL_stmt_return_next
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:644
PLpgSQL_expr * query
Definition: plpgsql.h:733
int16 typlen
Definition: plpgsql.h:204
void plpgsql_xact_cb(XactEvent event, void *arg)
Definition: pl_exec.c:8522
char * exitlabel
Definition: plpgsql.h:1063
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:869
PLpgSQL_variable * target
Definition: plpgsql.h:807
PLpgSQL_expr * cond
Definition: plpgsql.h:909
PLpgSQL_variable * target
Definition: plpgsql.h:940
int plpgsql_peek(void)
Definition: pl_scanner.c:420
struct PLpgSQL_stmt_loop PLpgSQL_stmt_loop
Oid rectypeid
Definition: plpgsql.h:397
bool plpgsql_token_is_unreserved_keyword(int token)
Definition: pl_scanner.c:387
struct PLpgSQL_stmt_rollback PLpgSQL_stmt_rollback
unsigned int stmtid
Definition: plpgsql.h:477
MemoryContext plpgsql_compile_tmp_cxt
Definition: pl_comp.c:55
int plpgsql_add_initdatums(int **varnos)
Definition: pl_comp.c:2371
PLpgSQL_expr * default_val
Definition: plpgsql.h:387
bool notnull
Definition: plpgsql.h:386
int plpgsql_extra_errors
Definition: pl_handler.c:53
PLpgSQL_condition * plpgsql_parse_err_condition(char *condname)
Definition: pl_comp.c:2242
Definition: pg_list.h:50
int plpgsql_variable_conflict
Definition: pl_handler.c:44
char * fieldname
Definition: plpgsql.h:416
int lineno
Definition: plpgsql.h:384
PLpgSQL_function * plpgsql_compile(FunctionCallInfo fcinfo, bool forValidator)
Definition: pl_comp.c:135
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:845
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:804
void plpgsql_dumptree(PLpgSQL_function *func)
Definition: pl_funcs.c:1624
void plpgsql_ns_pop(void)
Definition: pl_funcs.c:67
PLpgSQL_datum_type dtype
Definition: plpgsql.h:355
PLpgSQL_stmt_block * plpgsql_parse_result
Definition: pl_comp.c:41
PLpgSQL_expr * default_val
Definition: plpgsql.h:361
void plpgsql_scanner_finish(void)
Definition: pl_scanner.c:613
struct PLpgSQL_expr PLpgSQL_expr
Oid expr_simple_type
Definition: plpgsql.h:234
int firstfield
Definition: plpgsql.h:399
HeapTuple plpgsql_exec_trigger(PLpgSQL_function *func, TriggerData *trigdata)
Definition: pl_exec.c:901
PLpgSQL_nsitem_type
Definition: plpgsql.h:41
PLpgSQL_stmt_type cmd_type
Definition: plpgsql.h:773
int lineno
Definition: plpgsql.h:358
bool isnull
Definition: plpgsql.h:324
unsigned int stmtid
Definition: plpgsql.h:610
struct PLcword PLcword
bool returns_multiple_rows
Definition: plpgsql.h:813
bool notnull
Definition: plpgsql.h:360
Oid typoid
Definition: plpgsql.h:202
struct PLpgSQL_stmt_open PLpgSQL_stmt_open