diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 7a6fdcab94eaaa90b465b9da696144602cd10bf1..bc40d3e96a3ad6362e0c94a844802dc31b213a4d 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: execnodes.h,v 1.12 1997/09/08 21:52:40 momjian Exp $ + * $Id: execnodes.h,v 1.13 1998/02/13 03:45:22 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -80,16 +80,17 @@ typedef struct RelationInfo */ typedef struct ExprContext { - NodeTag type; - TupleTableSlot *ecxt_scantuple; - TupleTableSlot *ecxt_innertuple; - TupleTableSlot *ecxt_outertuple; - Relation ecxt_relation; - Index ecxt_relid; - ParamListInfo ecxt_param_list_info; - List *ecxt_range_table; - Datum *ecxt_values; /* precomputed values for aggreg */ - char *ecxt_nulls; /* null flags for aggreg values */ + NodeTag type; + TupleTableSlot *ecxt_scantuple; + TupleTableSlot *ecxt_innertuple; + TupleTableSlot *ecxt_outertuple; + Relation ecxt_relation; + Index ecxt_relid; + ParamListInfo ecxt_param_list_info; + ParamExecData *ecxt_param_exec_vals; /* this is for subselects */ + List *ecxt_range_table; + Datum *ecxt_values; /* precomputed values for aggreg */ + char *ecxt_nulls; /* null flags for aggreg values */ } ExprContext; /* ---------------- @@ -193,18 +194,19 @@ typedef struct JunkFilter */ typedef struct EState { - NodeTag type; - ScanDirection es_direction; - List *es_range_table; - RelationInfo *es_result_relation_info; - Relation es_into_relation_descriptor; - ParamListInfo es_param_list_info; - int es_BaseId; - TupleTable es_tupleTable; - JunkFilter *es_junkFilter; - int *es_refcount; - uint32 es_processed; /* # of tuples processed */ - Oid es_lastoid; /* last oid processed (by INSERT) */ + NodeTag type; + ScanDirection es_direction; + List *es_range_table; + RelationInfo *es_result_relation_info; + Relation es_into_relation_descriptor; + ParamListInfo es_param_list_info; + ParamExecData *es_param_exec_vals; /* this is for subselects */ + int es_BaseId; + TupleTable es_tupleTable; + JunkFilter *es_junkFilter; + int *es_refcount; + uint32 es_processed; /* # of tuples processed */ + Oid es_lastoid; /* last oid processed (by INSERT) */ } EState; /* ---------------- @@ -292,7 +294,8 @@ typedef struct CommonState typedef struct ResultState { CommonState cstate; /* its first field is NodeTag */ - int rs_done; + bool rs_done; + bool rs_checkqual; } ResultState; /* ---------------- diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 9c913797dd4b01a01106585049468906978ba5df..d205f4236a3ad75b1786eeb28875ed325855e18a 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: nodes.h,v 1.23 1998/01/17 04:53:38 momjian Exp $ + * $Id: nodes.h,v 1.24 1998/02/13 03:45:23 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -47,6 +47,7 @@ typedef enum NodeTag T_Choose, T_Tee, T_Group, + T_SubPlan, /*--------------------- * TAGS FOR PRIMITIVE NODES (primnodes.h) diff --git a/src/include/nodes/params.h b/src/include/nodes/params.h index 083c5faed41fae5897b392d81be18814cf0ce1c4..7a70a888b4530c303b4904365c22fdc0e250e161 100644 --- a/src/include/nodes/params.h +++ b/src/include/nodes/params.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: params.h,v 1.6 1997/09/08 21:52:48 momjian Exp $ + * $Id: params.h,v 1.7 1998/02/13 03:45:24 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -36,12 +36,16 @@ * * PARAM_OLD: Same as PARAM_NEW, but in this case we refer to * the "OLD" tuple. + * + * PARAM_EXEC: Evaluated by executor. Used for subselect... + * */ #define PARAM_NAMED 11 #define PARAM_NUM 12 #define PARAM_NEW 13 #define PARAM_OLD 14 +#define PARAM_EXEC 15 #define PARAM_INVALID 100 @@ -87,4 +91,11 @@ typedef struct ParamListInfoData typedef ParamListInfoData *ParamListInfo; +typedef struct ParamExecData +{ + void *execPlan; /* plan must be executed to get param value */ + Datum value; + bool isnull; +} ParamExecData; + #endif /* PARAMS_H */ diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index 871afacbc4b71a91a4c7791c21e4a107df5553b0..0091891aaeaf2adfe16dcc02093ff78ccb8627cc 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: plannodes.h,v 1.13 1998/01/15 19:00:13 momjian Exp $ + * $Id: plannodes.h,v 1.14 1998/02/13 03:45:25 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -74,6 +74,24 @@ typedef struct Plan List *qual; /* Node* or List* ?? */ struct Plan *lefttree; struct Plan *righttree; + List *extParam; /* indices of _all_ _external_ PARAM_EXEC for + * this plan in global es_param_exec_vals. + * Params from setParam from initPlan-s + * are not included, but their execParam-s + * are here!!! */ + List *locParam; /* someones from setParam-s */ + List *chgParam; /* list of changed ones from the above */ + List *initPlan; /* Init Plan nodes (un-correlated expr subselects) */ + List *subPlan; /* Other SubPlan nodes */ + + /* + * We really need in some TopPlan node to store range table and + * resultRelation from Query there and get rid of Query itself + * from Executor. Some other stuff like below could be put there, too. + */ + int nParamExec; /* Number of them in entire query. This is + * to get Executor know about how many + * param_exec there are in query plan. */ } Plan; /* ---------------- @@ -335,4 +353,24 @@ typedef struct Tee * plans */ } Tee; +/* --------------------- + * SubPlan node + * --------------------- + */ +typedef struct SubPlan +{ + NodeTag type; + Plan *plan; /* subselect plan itself */ + int plan_id; /* dummy thing because of we haven't + * equal funcs for plan nodes... actually, + * we could put *plan itself somewhere else + * (TopPlan node ?)... */ + List *rtable; /* range table */ + List *setParam; /* non-correlated EXPR & EXISTS subqueries + * have to set some Params for paren Plan */ + List *parParam; /* indices of corr. Vars from parent plan */ + SubLink *sublink; /* SubLink node for subselects in WHERE and HAVING */ + bool shutdown; /* shutdown plan if TRUE */ +} SubPlan; + #endif /* PLANNODES_H */ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 6a37bc1b204bb07358637d72d4011fd180be42c2..a16e2ee4c08b01d3a51486619b3a64ae50f898c7 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: primnodes.h,v 1.18 1998/02/10 16:04:27 momjian Exp $ + * $Id: primnodes.h,v 1.19 1998/02/13 03:45:29 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -86,7 +86,7 @@ typedef struct Fjoin */ typedef enum OpType { - OP_EXPR, FUNC_EXPR, OR_EXPR, AND_EXPR, NOT_EXPR + OP_EXPR, FUNC_EXPR, OR_EXPR, AND_EXPR, NOT_EXPR, SUBPLAN_EXPR } OpType; typedef struct Expr @@ -94,7 +94,7 @@ typedef struct Expr NodeTag type; Oid typeOid; /* oid of the type of this expr */ OpType opType; /* type of the op */ - Node *oper; /* could be Oper or Func */ + Node *oper; /* could be Oper or Func or SubPlan */ List *args; /* list of argument nodes */ } Expr;