diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-04-29 22:13:11 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-04-29 22:13:11 +0000 |
commit | aa282d44464df0fbfa0672dc353d36734ec1092e (patch) | |
tree | dbf42be31346c6716bc33e73e801cda670fc60e4 /src/include/parser | |
parent | 19141f558411e96446294baf240eaeccf6d68b64 (diff) | |
download | postgresql-aa282d44464df0fbfa0672dc353d36734ec1092e.tar.gz postgresql-aa282d44464df0fbfa0672dc353d36734ec1092e.zip |
Infrastructure for deducing Param types from context, in the same way
that the types of untyped string-literal constants are deduced (ie,
when coerce_type is applied to 'em, that's what the type must be).
Remove the ancient hack of storing the input Param-types array as a
global variable, and put the info into ParseState instead. This touches
a lot of files because of adjustment of routine parameter lists, but
it's really not a large patch. Note: PREPARE statement still insists on
exact specification of parameter types, but that could easily be relaxed
now, if we wanted to do so.
Diffstat (limited to 'src/include/parser')
-rw-r--r-- | src/include/parser/analyze.h | 8 | ||||
-rw-r--r-- | src/include/parser/gramparse.h | 5 | ||||
-rw-r--r-- | src/include/parser/parse_coerce.h | 17 | ||||
-rw-r--r-- | src/include/parser/parse_func.h | 6 | ||||
-rw-r--r-- | src/include/parser/parse_node.h | 17 | ||||
-rw-r--r-- | src/include/parser/parse_oper.h | 11 | ||||
-rw-r--r-- | src/include/parser/parser.h | 8 |
7 files changed, 48 insertions, 24 deletions
diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index f780ec4d294..b7d6a7d6658 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: analyze.h,v 1.20 2002/06/20 20:29:51 momjian Exp $ + * $Id: analyze.h,v 1.21 2003/04/29 22:13:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -15,7 +15,11 @@ #include "parser/parse_node.h" -extern List *parse_analyze(Node *parseTree, ParseState *parentParseState); + +extern List *parse_analyze(Node *parseTree, Oid *paramTypes, int numParams); +extern List *parse_analyze_varparams(Node *parseTree, Oid **paramTypes, + int *numParams); +extern List *parse_sub_analyze(Node *parseTree, ParseState *parentParseState); extern List *analyzeCreateSchemaStmt(CreateSchemaStmt *stmt); extern void CheckSelectForUpdate(Query *qry); diff --git a/src/include/parser/gramparse.h b/src/include/parser/gramparse.h index 97108f2b1c9..f9a03959116 100644 --- a/src/include/parser/gramparse.h +++ b/src/include/parser/gramparse.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: gramparse.h,v 1.26 2003/04/27 20:09:44 tgl Exp $ + * $Id: gramparse.h,v 1.27 2003/04/29 22:13:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -17,9 +17,8 @@ #include "nodes/parsenodes.h" + /* from parser.c */ -extern void parser_param_set(Oid *typev, int nargs); -extern Oid param_type(int t); extern int yylex(void); /* from scan.l */ diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h index b21a83601bf..de2ea95db85 100644 --- a/src/include/parser/parse_coerce.h +++ b/src/include/parser/parse_coerce.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: parse_coerce.h,v 1.50 2003/04/08 23:20:04 tgl Exp $ + * $Id: parse_coerce.h,v 1.51 2003/04/29 22:13:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -17,6 +17,7 @@ #include "catalog/pg_type.h" #include "parser/parse_node.h" + typedef enum CATEGORY { INVALID_TYPE, @@ -38,22 +39,26 @@ extern bool IsBinaryCoercible(Oid srctype, Oid targettype); extern bool IsPreferredType(CATEGORY category, Oid type); extern CATEGORY TypeCategory(Oid type); -extern Node *coerce_to_target_type(Node *expr, Oid exprtype, +extern Node *coerce_to_target_type(ParseState *pstate, + Node *expr, Oid exprtype, Oid targettype, int32 targettypmod, CoercionContext ccontext, CoercionForm cformat); extern bool can_coerce_type(int nargs, Oid *input_typeids, Oid *target_typeids, CoercionContext ccontext); -extern Node *coerce_type(Node *node, Oid inputTypeId, Oid targetTypeId, +extern Node *coerce_type(ParseState *pstate, Node *node, + Oid inputTypeId, Oid targetTypeId, CoercionContext ccontext, CoercionForm cformat); extern Node *coerce_to_domain(Node *arg, Oid baseTypeId, Oid typeId, CoercionForm cformat); -extern Node *coerce_to_boolean(Node *node, const char *constructName); +extern Node *coerce_to_boolean(ParseState *pstate, Node *node, + const char *constructName); extern Oid select_common_type(List *typeids, const char *context); -extern Node *coerce_to_common_type(Node *node, Oid targetTypeId, - const char *context); +extern Node *coerce_to_common_type(ParseState *pstate, Node *node, + Oid targetTypeId, + const char *context); extern bool check_generic_type_consistency(Oid *actual_arg_types, Oid *declared_arg_types, diff --git a/src/include/parser/parse_func.h b/src/include/parser/parse_func.h index 3bd369e3c70..2b1a1fad4b9 100644 --- a/src/include/parser/parse_func.h +++ b/src/include/parser/parse_func.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: parse_func.h,v 1.44 2003/04/08 23:20:04 tgl Exp $ + * $Id: parse_func.h,v 1.45 2003/04/29 22:13:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -16,6 +16,7 @@ #include "parser/parse_node.h" + /* * This structure is used to explore the inheritance hierarchy above * nodes in the type tree in order to disambiguate among polymorphic @@ -49,7 +50,8 @@ extern FuncDetailCode func_get_detail(List *funcname, List *fargs, extern bool typeInheritsFrom(Oid subclassTypeId, Oid superclassTypeId); -extern void make_fn_arguments(List *fargs, +extern void make_fn_arguments(ParseState *pstate, + List *fargs, Oid *actual_arg_types, Oid *declared_arg_types); diff --git a/src/include/parser/parse_node.h b/src/include/parser/parse_node.h index 12dcaccbefd..1f52963e5c0 100644 --- a/src/include/parser/parse_node.h +++ b/src/include/parser/parse_node.h @@ -1,12 +1,13 @@ /*------------------------------------------------------------------------- * * parse_node.h + * Internal definitions for parser * * * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: parse_node.h,v 1.34 2003/04/08 23:20:04 tgl Exp $ + * $Id: parse_node.h,v 1.35 2003/04/29 22:13:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -32,6 +33,15 @@ * joinlist. Note that an RTE that is present in p_namespace, but does not * have its inFromCl flag set, is accessible only with an explicit qualifier; * lookups of unqualified column names should ignore it. + * + * p_paramtypes: an array of p_numparams type OIDs for $n parameter symbols + * (zeroth entry in array corresponds to $1). If p_variableparams is true, the + * set of param types is not predetermined; in that case, a zero array entry + * means that parameter number hasn't been seen, and UNKNOWNOID means the + * parameter has been used but its type is not yet known. NOTE: in a stack + * of ParseStates, only the topmost ParseState contains paramtype info; but + * we copy the p_variableparams flag down to the child nodes for speed in + * coerce_type. */ typedef struct ParseState { @@ -40,9 +50,12 @@ typedef struct ParseState List *p_joinlist; /* join items so far (will become FromExpr * node's fromlist) */ List *p_namespace; /* current lookup namespace (join items) */ - int p_last_resno; /* last targetlist resno assigned */ + Oid *p_paramtypes; /* OIDs of types for $n parameter symbols */ + int p_numparams; /* allocated size of p_paramtypes[] */ + int p_next_resno; /* next targetlist resno to assign */ List *p_forUpdate; /* FOR UPDATE clause, if any (see gram.y) */ Node *p_value_substitute; /* what to replace VALUE with, if any */ + bool p_variableparams; bool p_hasAggs; bool p_hasSubLinks; bool p_is_insert; diff --git a/src/include/parser/parse_oper.h b/src/include/parser/parse_oper.h index 2cde7189dda..6d2268bf557 100644 --- a/src/include/parser/parse_oper.h +++ b/src/include/parser/parse_oper.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: parse_oper.h,v 1.24 2003/04/08 23:20:04 tgl Exp $ + * $Id: parse_oper.h,v 1.25 2003/04/29 22:13:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -15,7 +15,8 @@ #define PARSE_OPER_H #include "access/htup.h" -#include "nodes/parsenodes.h" +#include "parser/parse_node.h" + typedef HeapTuple Operator; @@ -50,8 +51,10 @@ extern Oid oprid(Operator op); extern Oid oprfuncid(Operator op); /* Build expression tree for an operator invocation */ -extern Expr *make_op(List *opname, Node *ltree, Node *rtree); -extern Expr *make_op_expr(Operator op, Node *ltree, Node *rtree, +extern Expr *make_op(ParseState *pstate, List *opname, + Node *ltree, Node *rtree); +extern Expr *make_op_expr(ParseState *pstate, Operator op, + Node *ltree, Node *rtree, Oid ltypeId, Oid rtypeId); #endif /* PARSE_OPER_H */ diff --git a/src/include/parser/parser.h b/src/include/parser/parser.h index 42d82869f08..e5e5bddfafc 100644 --- a/src/include/parser/parser.h +++ b/src/include/parser/parser.h @@ -1,21 +1,19 @@ /*------------------------------------------------------------------------- * * parser.h - * + * Definitions for the "raw" parser (lex and yacc phases only) * * * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: parser.h,v 1.14 2003/04/27 20:09:44 tgl Exp $ + * $Id: parser.h,v 1.15 2003/04/29 22:13:11 tgl Exp $ * *------------------------------------------------------------------------- */ #ifndef PARSER_H #define PARSER_H -#include "parser/parse_node.h" - -extern List *parser(const char *str, Oid *typev, int nargs); +extern List *raw_parser(const char *str); #endif /* PARSER_H */ |