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

数据库系统

开发平台:

Unix_Linux

  1. /**********************************************************************
  2.  * plpgsql.h - Definitions for the PL/pgSQL
  3.  *   procedural language
  4.  *
  5.  * IDENTIFICATION
  6.  *   $Header: /usr/local/cvsroot/pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.3 1999/01/27 16:15:22 wieck 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. #ifndef PLPGSQL_H
  38. #define PLPGSQL_H
  39. #include <stdio.h>
  40. #include <stdarg.h>
  41. #include "postgres.h"
  42. #include "executor/spi.h"
  43. #include "commands/trigger.h"
  44. #include "fmgr.h"
  45. /**********************************************************************
  46.  * Definitions
  47.  **********************************************************************/
  48. /* ----------
  49.  * Compilers namestack item types
  50.  * ----------
  51.  */
  52. enum
  53. {
  54. PLPGSQL_NSTYPE_LABEL,
  55. PLPGSQL_NSTYPE_VAR,
  56. PLPGSQL_NSTYPE_ROW,
  57. PLPGSQL_NSTYPE_REC,
  58. PLPGSQL_NSTYPE_RECFIELD
  59. };
  60. /* ----------
  61.  * Datum array node types
  62.  * ----------
  63.  */
  64. enum
  65. {
  66. PLPGSQL_DTYPE_VAR,
  67. PLPGSQL_DTYPE_ROW,
  68. PLPGSQL_DTYPE_REC,
  69. PLPGSQL_DTYPE_RECFIELD,
  70. PLPGSQL_DTYPE_EXPR,
  71. PLPGSQL_DTYPE_TRIGARG
  72. };
  73. /* ----------
  74.  * Execution tree node types
  75.  * ----------
  76.  */
  77. enum
  78. {
  79. PLPGSQL_STMT_BLOCK,
  80. PLPGSQL_STMT_ASSIGN,
  81. PLPGSQL_STMT_IF,
  82. PLPGSQL_STMT_LOOP,
  83. PLPGSQL_STMT_WHILE,
  84. PLPGSQL_STMT_FORI,
  85. PLPGSQL_STMT_FORS,
  86. PLPGSQL_STMT_SELECT,
  87. PLPGSQL_STMT_EXIT,
  88. PLPGSQL_STMT_RETURN,
  89. PLPGSQL_STMT_RAISE,
  90. PLPGSQL_STMT_EXECSQL
  91. };
  92. /* ----------
  93.  * Execution node return codes
  94.  * ----------
  95.  */
  96. enum
  97. {
  98. PLPGSQL_RC_OK,
  99. PLPGSQL_RC_EXIT,
  100. PLPGSQL_RC_RETURN
  101. };
  102. /**********************************************************************
  103.  * Node and structure definitions
  104.  **********************************************************************/
  105. typedef struct
  106. { /* Dynamic string control structure */
  107. int alloc;
  108. int used;
  109. char    *value;
  110. } PLpgSQL_dstring;
  111. typedef struct
  112. { /* Postgres base data type */
  113. char    *typname;
  114. Oid typoid;
  115. FmgrInfo typinput;
  116. bool typbyval;
  117. int16 atttypmod;
  118. } PLpgSQL_type;
  119. typedef struct
  120. { /* Generic datum array item */
  121. int dtype;
  122. int dno;
  123. } PLpgSQL_datum;
  124. typedef struct
  125. { /* SQL Query to plan and execute */
  126. int dtype;
  127. int exprno;
  128. char    *query;
  129. void    *plan;
  130. Node    *plan_simple_expr;
  131. Oid plan_simple_type;
  132. Oid    *plan_argtypes;
  133. int nparams;
  134. int params[1];
  135. } PLpgSQL_expr;
  136. typedef struct
  137. { /* Local variable */
  138. int dtype;
  139. int varno;
  140. char    *refname;
  141. int lineno;
  142. PLpgSQL_type *datatype;
  143. int isconst;
  144. int notnull;
  145. PLpgSQL_expr *default_val;
  146. Datum value;
  147. bool isnull;
  148. int shouldfree;
  149. } PLpgSQL_var;
  150. typedef struct
  151. { /* Rowtype */
  152. int dtype;
  153. int rowno;
  154. char    *refname;
  155. int lineno;
  156. Oid rowtypeclass;
  157. int nfields;
  158. char   **fieldnames;
  159. int    *varnos;
  160. } PLpgSQL_row;
  161. typedef struct
  162. { /* Record of undefined structure */
  163. int dtype;
  164. int recno;
  165. char    *refname;
  166. int lineno;
  167. HeapTuple tup;
  168. TupleDesc tupdesc;
  169. } PLpgSQL_rec;
  170. typedef struct
  171. { /* Field in record */
  172. int dtype;
  173. int rfno;
  174. char    *fieldname;
  175. int recno;
  176. } PLpgSQL_recfield;
  177. typedef struct
  178. { /* Positional argument to trigger */
  179. int dtype;
  180. int dno;
  181. PLpgSQL_expr *argnum;
  182. } PLpgSQL_trigarg;
  183. typedef struct
  184. { /* Item in the compilers namestack */
  185. int itemtype;
  186. int itemno;
  187. char name[1];
  188. } PLpgSQL_nsitem;
  189. typedef struct PLpgSQL_ns
  190. { /* Compiler namestack level */
  191. int items_alloc;
  192. int items_used;
  193. PLpgSQL_nsitem **items;
  194. struct PLpgSQL_ns *upper;
  195. } PLpgSQL_ns;
  196. typedef struct
  197. { /* List of execution nodes */
  198. int stmts_alloc;
  199. int stmts_used;
  200. struct PLpgSQL_stmt **stmts;
  201. } PLpgSQL_stmts;
  202. typedef struct
  203. { /* Generic execution node */
  204. int cmd_type;
  205. int lineno;
  206. } PLpgSQL_stmt;
  207. typedef struct
  208. { /* Block of statements */
  209. int cmd_type;
  210. int lineno;
  211. char    *label;
  212. PLpgSQL_stmts *body;
  213. int n_initvars;
  214. int    *initvarnos;
  215. } PLpgSQL_stmt_block;
  216. typedef struct
  217. { /* Assign statement */
  218. int cmd_type;
  219. int lineno;
  220. int varno;
  221. PLpgSQL_expr *expr;
  222. } PLpgSQL_stmt_assign;
  223. typedef struct
  224. { /* IF statement */
  225. int cmd_type;
  226. int lineno;
  227. PLpgSQL_expr *cond;
  228. PLpgSQL_stmts *true_body;
  229. PLpgSQL_stmts *false_body;
  230. } PLpgSQL_stmt_if;
  231. typedef struct
  232. { /* Unconditional LOOP statement */
  233. int cmd_type;
  234. int lineno;
  235. char    *label;
  236. PLpgSQL_stmts *body;
  237. } PLpgSQL_stmt_loop;
  238. typedef struct
  239. { /* WHILE cond LOOP statement */
  240. int cmd_type;
  241. int lineno;
  242. char    *label;
  243. PLpgSQL_expr *cond;
  244. PLpgSQL_stmts *body;
  245. } PLpgSQL_stmt_while;
  246. typedef struct
  247. { /* FOR statement with integer loopvar */
  248. int cmd_type;
  249. int lineno;
  250. char    *label;
  251. PLpgSQL_var *var;
  252. PLpgSQL_expr *lower;
  253. PLpgSQL_expr *upper;
  254. int reverse;
  255. PLpgSQL_stmts *body;
  256. } PLpgSQL_stmt_fori;
  257. typedef struct
  258. { /* FOR statement running over SELECT */
  259. int cmd_type;
  260. int lineno;
  261. char    *label;
  262. PLpgSQL_rec *rec;
  263. PLpgSQL_row *row;
  264. PLpgSQL_expr *query;
  265. PLpgSQL_stmts *body;
  266. } PLpgSQL_stmt_fors;
  267. typedef struct
  268. { /* SELECT ... INTO statement */
  269. int cmd_type;
  270. int lineno;
  271. PLpgSQL_rec *rec;
  272. PLpgSQL_row *row;
  273. PLpgSQL_expr *query;
  274. } PLpgSQL_stmt_select;
  275. typedef struct
  276. { /* EXIT statement */
  277. int cmd_type;
  278. int lineno;
  279. char    *label;
  280. PLpgSQL_expr *cond;
  281. } PLpgSQL_stmt_exit;
  282. typedef struct
  283. { /* RETURN statement */
  284. int cmd_type;
  285. int lineno;
  286. bool retistuple;
  287. PLpgSQL_expr *expr;
  288. int retrecno;
  289. } PLpgSQL_stmt_return;
  290. typedef struct
  291. { /* RAISE statement */
  292. int cmd_type;
  293. int lineno;
  294. int elog_level;
  295. char    *message;
  296. int nparams;
  297. int    *params;
  298. } PLpgSQL_stmt_raise;
  299. typedef struct
  300. { /* Generic SQL statement to execute */
  301. int cmd_type;
  302. int lineno;
  303. PLpgSQL_expr *sqlstmt;
  304. } PLpgSQL_stmt_execsql;
  305. typedef struct PLpgSQL_function
  306. { /* Complete compiled function   */
  307. Oid fn_oid;
  308. char    *fn_name;
  309. int fn_functype;
  310. Oid fn_rettype;
  311. int fn_rettyplen;
  312. bool fn_retbyval;
  313. FmgrInfo fn_retinput;
  314. bool fn_retistuple;
  315. bool fn_retset;
  316. int fn_nargs;
  317. int fn_argvarnos[MAXFMGRARGS];
  318. int found_varno;
  319. int new_varno;
  320. int old_varno;
  321. int tg_name_varno;
  322. int tg_when_varno;
  323. int tg_level_varno;
  324. int tg_op_varno;
  325. int tg_relid_varno;
  326. int tg_relname_varno;
  327. int tg_nargs_varno;
  328. int ndatums;
  329. PLpgSQL_datum **datums;
  330. PLpgSQL_stmt_block *action;
  331. struct PLpgSQL_function *next;
  332. } PLpgSQL_function;
  333. typedef struct
  334. { /* Runtime execution data */
  335. Datum retval;
  336. bool retisnull;
  337. Oid rettype;
  338. bool retistuple;
  339. TupleDesc rettupdesc;
  340. bool retisset;
  341. char    *exitlabel;
  342. int trig_nargs;
  343. Datum    *trig_argv;
  344. int found_varno;
  345. int ndatums;
  346. PLpgSQL_datum **datums;
  347. } PLpgSQL_execstate;
  348. /**********************************************************************
  349.  * Global variable declarations
  350.  **********************************************************************/
  351. extern int plpgsql_DumpExecTree;
  352. extern int plpgsql_SpaceScanned;
  353. extern int plpgsql_nDatums;
  354. extern PLpgSQL_datum **plpgsql_Datums;
  355. extern int plpgsql_error_lineno;
  356. extern char *plpgsql_error_funcname;
  357. extern PLpgSQL_function *plpgsql_curr_compile;
  358. /**********************************************************************
  359.  * Function declarations
  360.  **********************************************************************/
  361. extern char *pstrdup(char *s);
  362. /* ----------
  363.  * Functions in pl_comp.c
  364.  * ----------
  365.  */
  366. extern PLpgSQL_function *plpgsql_compile(Oid fn_oid, int functype);
  367. extern int plpgsql_parse_word(char *word);
  368. extern int plpgsql_parse_dblword(char *string);
  369. extern int plpgsql_parse_tripword(char *string);
  370. extern int plpgsql_parse_wordtype(char *string);
  371. extern int plpgsql_parse_dblwordtype(char *string);
  372. extern int plpgsql_parse_wordrowtype(char *string);
  373. extern void plpgsql_adddatum(PLpgSQL_datum * new);
  374. extern int plpgsql_add_initdatums(int **varnos);
  375. extern void plpgsql_comperrinfo(void);
  376. /* ----------
  377.  * Functions in pl_exec.c
  378.  * ----------
  379.  */
  380. extern Datum plpgsql_exec_function(PLpgSQL_function * func,
  381.   FmgrValues *args, bool *isNull);
  382. extern HeapTuple plpgsql_exec_trigger(PLpgSQL_function * func,
  383.  TriggerData *trigdata);
  384. /* ----------
  385.  * Functions for the dynamic string handling in pl_funcs.c
  386.  * ----------
  387.  */
  388. extern void plpgsql_dstring_init(PLpgSQL_dstring * ds);
  389. extern void plpgsql_dstring_free(PLpgSQL_dstring * ds);
  390. extern void plpgsql_dstring_append(PLpgSQL_dstring * ds, char *str);
  391. extern char *plpgsql_dstring_get(PLpgSQL_dstring * ds);
  392. /* ----------
  393.  * Functions for the namestack handling in pl_funcs.c
  394.  * ----------
  395.  */
  396. extern void plpgsql_ns_init(void);
  397. extern bool plpgsql_ns_setlocal(bool flag);
  398. extern void plpgsql_ns_push(char *label);
  399. extern void plpgsql_ns_pop(void);
  400. extern void plpgsql_ns_additem(int itemtype, int itemno, char *name);
  401. extern PLpgSQL_nsitem *plpgsql_ns_lookup(char *name, char *nsname);
  402. extern void plpgsql_ns_rename(char *oldname, char *newname);
  403. /* ----------
  404.  * Other functions in pl_funcs.c
  405.  * ----------
  406.  */
  407. extern void plpgsql_dumptree(PLpgSQL_function * func);
  408. extern char *plpgsql_tolower(char *s);
  409. /* ----------
  410.  * Externs in gram.y and scan.l
  411.  * ----------
  412.  */
  413. extern PLpgSQL_expr *plpgsql_read_expression(int until, char *s);
  414. extern void plpgsql_yyrestart(FILE *fp);
  415. extern int plpgsql_yylex();
  416. extern void plpgsql_setinput(char *s, int functype);
  417. extern int plpgsql_yyparse();
  418. #endif  /* PLPGSQL_H */