1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
/*-------------------------------------------------------------------------
*
* planner.h
* Externally declared locator functions
*
*
* Portions Copyright (c) 2012-2014, TransLattice, Inc.
* Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
* Portions Copyright (c) 2010-2012 Postgres-XC Development Group
*
* src/include/pgxc/planner.h
*
*-------------------------------------------------------------------------
*/
#ifndef PGXCPLANNER_H
#define PGXCPLANNER_H
#include "fmgr.h"
#include "lib/stringinfo.h"
#include "nodes/params.h"
#include "nodes/parsenodes.h"
#include "nodes/plannodes.h"
#include "nodes/primnodes.h"
#include "pgxc/locator.h"
#include "tcop/dest.h"
#include "nodes/relation.h"
typedef enum
{
COMBINE_TYPE_NONE, /* it is known that no row count, do not parse */
COMBINE_TYPE_SUM, /* sum row counts (partitioned, round robin) */
COMBINE_TYPE_SAME /* expect all row counts to be the same (replicated write) */
} CombineType;
/* For sorting within RemoteQuery handling */
/*
* It is pretty much like Sort, but without Plan. We may use Sort later.
*/
typedef struct
{
NodeTag type;
int numCols; /* number of sort-key columns */
AttrNumber *sortColIdx; /* their indexes in the target list */
Oid *sortOperators; /* OIDs of operators to sort them by */
Oid *sortCollations;
bool *nullsFirst; /* NULLS FIRST/LAST directions */
} SimpleSort;
/*
* Determines if query has to be launched
* on Coordinators only (SEQUENCE DDL),
* on Datanodes (normal Remote Queries),
* or on all Postgres-XC nodes (Utilities and DDL).
*/
typedef enum
{
EXEC_ON_CURRENT,
EXEC_ON_DATANODES,
EXEC_ON_COORDS,
EXEC_ON_ALL_NODES,
EXEC_ON_NONE
} RemoteQueryExecType;
typedef enum
{
EXEC_DIRECT_NONE,
EXEC_DIRECT_LOCAL,
EXEC_DIRECT_LOCAL_UTILITY,
EXEC_DIRECT_UTILITY,
EXEC_DIRECT_SELECT,
EXEC_DIRECT_INSERT,
EXEC_DIRECT_UPDATE,
EXEC_DIRECT_DELETE
} ExecDirectType;
/*
* Contains instructions on processing a step of a query.
* In the prototype this will be simple, but it will eventually
* evolve into a GridSQL-style QueryStep.
*/
typedef struct
{
Scan scan;
ExecDirectType exec_direct_type; /* track if remote query is execute direct and what type it is */
char *sql_statement;
ExecNodes *exec_nodes; /* List of Datanodes where to launch query */
CombineType combine_type;
SimpleSort *sort;
bool read_only; /* do not use 2PC when committing read only steps */
char *statement; /* if specified use it as a PreparedStatement name on Datanodes */
char *cursor; /* if specified use it as a Portal name on Datanodes */
int rq_num_params; /* number of parameters present in
remote statement */
Oid *rq_param_types; /* parameter types for the remote
statement */
RemoteQueryExecType exec_type;
int reduce_level; /* in case of reduced JOIN, it's level */
char *outer_alias;
char *inner_alias;
int outer_reduce_level;
int inner_reduce_level;
Relids outer_relids;
Relids inner_relids;
char *inner_statement;
char *outer_statement;
char *join_condition;
bool has_row_marks; /* Did SELECT had FOR UPDATE/SHARE? */
bool has_ins_child_sel_parent; /* This node is part of an INSERT SELECT that
* inserts into child by selecting from its parent */
bool rq_finalise_aggs; /* Aggregates should be finalised at
the
* Datanode */
bool rq_sortgroup_colno; /* Use resno for sort group references
* instead of expressions */
Query *remote_query; /* Query structure representing the query
to be
* sent to the datanodes */
List *base_tlist; /* the targetlist representing the result
of
* the query to be sent to the datanode */
/*
* Reference targetlist of Vars to match the Vars in the plan nodes on
* coordinator to the corresponding Vars in the remote_query. These
* targetlists are used to while replacing/adding targetlist and quals in
* the remote_query.
*/
List *coord_var_tlist;
List *query_var_tlist;
bool is_temp;
} RemoteQuery;
/*
* Going to be a RemoteQuery replacement.
* Submit left subplan to the nodes defined by the Distribution and combine
* results.
*/
typedef struct
{
Scan scan;
char distributionType;
AttrNumber distributionKey;
List *distributionNodes;
List *distributionRestrict;
List *nodeList;
bool execOnAll;
SimpleSort *sort;
char *cursor;
int unique;
} RemoteSubplan;
/*
* FQS_context
* This context structure is used by the Fast Query Shipping walker, to gather
* information during analysing query for Fast Query Shipping.
*/
typedef struct
{
bool sc_for_expr; /* if false, the we are checking shippability
* of the Query, otherwise, we are checking
* shippability of a stand-alone expression.
*/
Bitmapset *sc_shippability; /* The conditions for (un)shippability of the
* query.
*/
Query *sc_query; /* the query being analysed for FQS */
int sc_query_level; /* level of the query */
int sc_max_varlevelsup; /* maximum upper level referred to by any
* variable reference in the query. If this
* value is greater than 0, the query is not
* shippable, if shipped alone.
*/
ExecNodes *sc_exec_nodes; /* nodes where the query should be executed */
ExecNodes *sc_subquery_en; /* ExecNodes produced by merging the ExecNodes
* for individual subqueries. This gets
* ultimately merged with sc_exec_nodes.
*/
} Shippability_context;
extern PlannedStmt *pgxc_direct_planner(Query *query, int cursorOptions,
ParamListInfo boundParams);
extern List *AddRemoteQueryNode(List *stmts, const char *queryString,
RemoteQueryExecType remoteExecType);
extern PlannedStmt *pgxc_planner(Query *query, int cursorOptions,
ParamListInfo boundParams);
extern ExecNodes *pgxc_is_query_shippable(Query *query, int query_level);
#endif /* PGXCPLANNER_H */
|