← Back to Overview

src/backend/parser/parse_rpr.c

Coverage: 96/98 lines (98.0%)
Total Lines
98
modified
Covered
96
98.0%
Uncovered
2
2.0%
키보드 네비게이션
transformRPR() lines 58-154
Modified Lines Coverage: 34/36 lines (94.4%)
LineHitsSourceCommit
58 576 transformRPR(ParseState *pstate, WindowClause *wc, WindowDef *windef, d23df91Row pattern recognition patch (parse/analysis).
59 - List **targetlist) d23df91Row pattern recognition patch (parse/analysis).
60 - { d23df91Row pattern recognition patch (parse/analysis).
61 - /* Window definition must exist when called */ d23df91Row pattern recognition patch (parse/analysis).
62 576 Assert(windef != NULL); d23df91Row pattern recognition patch (parse/analysis).
63 - d23df91Row pattern recognition patch (parse/analysis).
64 - /* d23df91Row pattern recognition patch (parse/analysis).
65 - * Row Pattern Common Syntax clause exists? d23df91Row pattern recognition patch (parse/analysis).
66 - */ d23df91Row pattern recognition patch (parse/analysis).
67 576 if (windef->rpCommonSyntax == NULL) d23df91Row pattern recognition patch (parse/analysis).
68 1 return; d23df91Row pattern recognition patch (parse/analysis).
69 - d23df91Row pattern recognition patch (parse/analysis).
70 - /* Check Frame options */ d23df91Row pattern recognition patch (parse/analysis).
71 - be45529Disallow RANGE and GROUPS frame types with row pattern recognition
72 - /* Frame type must be "ROW" */ be45529Disallow RANGE and GROUPS frame types with row pattern recognition
73 575 if (wc->frameOptions & FRAMEOPTION_GROUPS) be45529Disallow RANGE and GROUPS frame types with row pattern recognition
74 2 ereport(ERROR, be45529Disallow RANGE and GROUPS frame types with row pattern recognition
75 - (errcode(ERRCODE_SYNTAX_ERROR), be45529Disallow RANGE and GROUPS frame types with row pattern recognition
76 - errmsg("FRAME option GROUP is not permitted when row pattern recognition is used"), be45529Disallow RANGE and GROUPS frame types with row pattern recognition
77 - errhint("Use: ROWS instead"), be45529Disallow RANGE and GROUPS frame types with row pattern recognition
78 - parser_errposition(pstate, be45529Disallow RANGE and GROUPS frame types with row pattern recognition
79 - windef->frameLocation >= 0 ? be45529Disallow RANGE and GROUPS frame types with row pattern recognition
80 - windef->frameLocation : windef->location))); be45529Disallow RANGE and GROUPS frame types with row pattern recognition
81 573 if (wc->frameOptions & FRAMEOPTION_RANGE) be45529Disallow RANGE and GROUPS frame types with row pattern recognition
82 3 ereport(ERROR, be45529Disallow RANGE and GROUPS frame types with row pattern recognition
83 - (errcode(ERRCODE_SYNTAX_ERROR), be45529Disallow RANGE and GROUPS frame types with row pattern recognition
84 - errmsg("FRAME option RANGE is not permitted when row pattern recognition is used"), be45529Disallow RANGE and GROUPS frame types with row pattern recognition
85 - errhint("Use: ROWS instead"), be45529Disallow RANGE and GROUPS frame types with row pattern recognition
86 - parser_errposition(pstate, be45529Disallow RANGE and GROUPS frame types with row pattern recognition
87 - windef->frameLocation >= 0 ? be45529Disallow RANGE and GROUPS frame types with row pattern recognition
88 - windef->frameLocation : windef->location))); be45529Disallow RANGE and GROUPS frame types with row pattern recognition
89 - be45529Disallow RANGE and GROUPS frame types with row pattern recognition
90 - /* Frame must start at current row */ d23df91Row pattern recognition patch (parse/analysis).
91 570 if ((wc->frameOptions & FRAMEOPTION_START_CURRENT_ROW) == 0) d23df91Row pattern recognition patch (parse/analysis).
92 - { d23df91Row pattern recognition patch (parse/analysis).
93 4 const char *frameType = "ROWS"; 9d2796cReview NFA executor and add comprehensive runtime tests
94 4 const char *startBound = "unknown"; d23df91Row pattern recognition patch (parse/analysis).
95 - d23df91Row pattern recognition patch (parse/analysis).
96 - /* Determine current start bound */ d23df91Row pattern recognition patch (parse/analysis).
97 4 if (wc->frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING) d23df91Row pattern recognition patch (parse/analysis).
98 2 startBound = "UNBOUNDED PRECEDING"; d23df91Row pattern recognition patch (parse/analysis).
99 2 else if (wc->frameOptions & FRAMEOPTION_START_OFFSET_PRECEDING) d23df91Row pattern recognition patch (parse/analysis).
100 1 startBound = "offset PRECEDING"; d23df91Row pattern recognition patch (parse/analysis).
101 1 else if (wc->frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING) d23df91Row pattern recognition patch (parse/analysis).
102 1 startBound = "offset FOLLOWING"; d23df91Row pattern recognition patch (parse/analysis).
103 - d23df91Row pattern recognition patch (parse/analysis).
104 - /* At least one valid frame start option should be set */ d23df91Row pattern recognition patch (parse/analysis).
105 4 Assert((wc->frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING) || d23df91Row pattern recognition patch (parse/analysis).
106 - (wc->frameOptions & FRAMEOPTION_START_OFFSET_PRECEDING) || d23df91Row pattern recognition patch (parse/analysis).
107 - (wc->frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING)); d23df91Row pattern recognition patch (parse/analysis).
108 - d23df91Row pattern recognition patch (parse/analysis).
109 4 ereport(ERROR, d23df91Row pattern recognition patch (parse/analysis).
110 - (errcode(ERRCODE_SYNTAX_ERROR), d23df91Row pattern recognition patch (parse/analysis).
111 - errmsg("FRAME must start at CURRENT ROW when row pattern recognition is used"), d23df91Row pattern recognition patch (parse/analysis).
112 - errdetail("Current frame starts with %s.", startBound), d23df91Row pattern recognition patch (parse/analysis).
113 - errhint("Use: %s BETWEEN CURRENT ROW AND ...", frameType), d23df91Row pattern recognition patch (parse/analysis).
114 - parser_errposition(pstate, windef->frameLocation >= 0 ? windef->frameLocation : windef->location))); d23df91Row pattern recognition patch (parse/analysis).
115 0 } d23df91Row pattern recognition patch (parse/analysis).
116 - d23df91Row pattern recognition patch (parse/analysis).
117 - /* EXCLUDE options are not permitted */ d23df91Row pattern recognition patch (parse/analysis).
118 566 if ((wc->frameOptions & FRAMEOPTION_EXCLUSION) != 0) d23df91Row pattern recognition patch (parse/analysis).
119 - { d23df91Row pattern recognition patch (parse/analysis).
120 4 const char *excludeType = "EXCLUDE"; d23df91Row pattern recognition patch (parse/analysis).
121 - d23df91Row pattern recognition patch (parse/analysis).
122 - /* Determine which EXCLUDE option was used */ d23df91Row pattern recognition patch (parse/analysis).
123 4 if (wc->frameOptions & FRAMEOPTION_EXCLUDE_CURRENT_ROW) d23df91Row pattern recognition patch (parse/analysis).
124 2 excludeType = "EXCLUDE CURRENT ROW"; d23df91Row pattern recognition patch (parse/analysis).
125 2 else if (wc->frameOptions & FRAMEOPTION_EXCLUDE_GROUP) d23df91Row pattern recognition patch (parse/analysis).
126 1 excludeType = "EXCLUDE GROUP"; d23df91Row pattern recognition patch (parse/analysis).
127 1 else if (wc->frameOptions & FRAMEOPTION_EXCLUDE_TIES) d23df91Row pattern recognition patch (parse/analysis).
128 1 excludeType = "EXCLUDE TIES"; d23df91Row pattern recognition patch (parse/analysis).
129 - d23df91Row pattern recognition patch (parse/analysis).
130 - /* At least one valid exclude option should be set */ d23df91Row pattern recognition patch (parse/analysis).
131 4 Assert((wc->frameOptions & FRAMEOPTION_EXCLUDE_CURRENT_ROW) || d23df91Row pattern recognition patch (parse/analysis).
132 - (wc->frameOptions & FRAMEOPTION_EXCLUDE_GROUP) || d23df91Row pattern recognition patch (parse/analysis).
133 - (wc->frameOptions & FRAMEOPTION_EXCLUDE_TIES)); d23df91Row pattern recognition patch (parse/analysis).
134 - d23df91Row pattern recognition patch (parse/analysis).
135 4 ereport(ERROR, d23df91Row pattern recognition patch (parse/analysis).
136 - (errcode(ERRCODE_SYNTAX_ERROR), d23df91Row pattern recognition patch (parse/analysis).
137 - errmsg("EXCLUDE options are not permitted when row pattern recognition is used"), d23df91Row pattern recognition patch (parse/analysis).
138 - errdetail("Frame definition includes %s.", excludeType), d23df91Row pattern recognition patch (parse/analysis).
139 - errhint("Remove the EXCLUDE clause from the window definition."), d23df91Row pattern recognition patch (parse/analysis).
140 - parser_errposition(pstate, windef->excludeLocation >= 0 ? windef->excludeLocation : windef->location))); d23df91Row pattern recognition patch (parse/analysis).
141 0 } d23df91Row pattern recognition patch (parse/analysis).
142 - d23df91Row pattern recognition patch (parse/analysis).
143 - /* Transform AFTER MATCH SKIP TO clause */ d23df91Row pattern recognition patch (parse/analysis).
144 562 wc->rpSkipTo = windef->rpCommonSyntax->rpSkipTo; d23df91Row pattern recognition patch (parse/analysis).
145 - d23df91Row pattern recognition patch (parse/analysis).
146 - /* Transform SEEK or INITIAL clause */ d23df91Row pattern recognition patch (parse/analysis).
147 562 wc->initial = windef->rpCommonSyntax->initial; d23df91Row pattern recognition patch (parse/analysis).
148 - d23df91Row pattern recognition patch (parse/analysis).
149 - /* Transform DEFINE clause into list of TargetEntry's */ d23df91Row pattern recognition patch (parse/analysis).
150 562 wc->defineClause = transformDefineClause(pstate, wc, windef, targetlist); d23df91Row pattern recognition patch (parse/analysis).
151 - d23df91Row pattern recognition patch (parse/analysis).
152 - /* Store PATTERN AST for deparsing */ d23df91Row pattern recognition patch (parse/analysis).
153 562 wc->rpPattern = windef->rpCommonSyntax->rpPattern; d23df91Row pattern recognition patch (parse/analysis).
154 563 } d23df91Row pattern recognition patch (parse/analysis).
validateRPRPatternVarCount() lines 166-216
Modified Lines Coverage: 23/23 lines (100.0%)
LineHitsSourceCommit
166 3890 validateRPRPatternVarCount(ParseState *pstate, RPRPatternNode *node, d23df91Row pattern recognition patch (parse/analysis).
167 - List **varNames) d23df91Row pattern recognition patch (parse/analysis).
168 - { d23df91Row pattern recognition patch (parse/analysis).
169 3890 ListCell *lc; d23df91Row pattern recognition patch (parse/analysis).
170 - d23df91Row pattern recognition patch (parse/analysis).
171 - /* Pattern node must exist - parser always provides non-NULL root */ d23df91Row pattern recognition patch (parse/analysis).
172 3890 Assert(node != NULL); d23df91Row pattern recognition patch (parse/analysis).
173 - d23df91Row pattern recognition patch (parse/analysis).
174 3890 switch (node->nodeType) d23df91Row pattern recognition patch (parse/analysis).
175 - { d23df91Row pattern recognition patch (parse/analysis).
176 - case RPR_PATTERN_VAR: d23df91Row pattern recognition patch (parse/analysis).
177 - /* Add variable name if not already in list */ d23df91Row pattern recognition patch (parse/analysis).
178 - { d23df91Row pattern recognition patch (parse/analysis).
179 2465 bool found = false; d23df91Row pattern recognition patch (parse/analysis).
180 - d23df91Row pattern recognition patch (parse/analysis).
181 130338 foreach(lc, *varNames) d23df91Row pattern recognition patch (parse/analysis).
182 - { d23df91Row pattern recognition patch (parse/analysis).
183 127873 if (strcmp(strVal(lfirst(lc)), node->varName) == 0) d23df91Row pattern recognition patch (parse/analysis).
184 - { d23df91Row pattern recognition patch (parse/analysis).
185 208 found = true; d23df91Row pattern recognition patch (parse/analysis).
186 208 break; d23df91Row pattern recognition patch (parse/analysis).
187 - } d23df91Row pattern recognition patch (parse/analysis).
188 127665 } d23df91Row pattern recognition patch (parse/analysis).
189 2465 if (!found) d23df91Row pattern recognition patch (parse/analysis).
190 - { d23df91Row pattern recognition patch (parse/analysis).
191 - /* Check against RPR_VARID_MAX before adding */ d23df91Row pattern recognition patch (parse/analysis).
192 2257 if (list_length(*varNames) >= RPR_VARID_MAX) d23df91Row pattern recognition patch (parse/analysis).
193 3 ereport(ERROR, d23df91Row pattern recognition patch (parse/analysis).
194 - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), d23df91Row pattern recognition patch (parse/analysis).
195 - errmsg("too many pattern variables"), d23df91Row pattern recognition patch (parse/analysis).
196 - errdetail("Maximum is %d.", RPR_VARID_MAX), d23df91Row pattern recognition patch (parse/analysis).
197 - parser_errposition(pstate, d23df91Row pattern recognition patch (parse/analysis).
198 - exprLocation((Node *) node)))); d23df91Row pattern recognition patch (parse/analysis).
199 - d23df91Row pattern recognition patch (parse/analysis).
200 2254 *varNames = lappend(*varNames, makeString(pstrdup(node->varName))); d23df91Row pattern recognition patch (parse/analysis).
201 2254 } d23df91Row pattern recognition patch (parse/analysis).
202 2462 } d23df91Row pattern recognition patch (parse/analysis).
203 2462 break; d23df91Row pattern recognition patch (parse/analysis).
204 - d23df91Row pattern recognition patch (parse/analysis).
205 - case RPR_PATTERN_SEQ: d23df91Row pattern recognition patch (parse/analysis).
206 - case RPR_PATTERN_ALT: d23df91Row pattern recognition patch (parse/analysis).
207 - case RPR_PATTERN_GROUP: d23df91Row pattern recognition patch (parse/analysis).
208 - /* Recurse into children */ d23df91Row pattern recognition patch (parse/analysis).
209 4750 foreach(lc, node->children) d23df91Row pattern recognition patch (parse/analysis).
210 - { d23df91Row pattern recognition patch (parse/analysis).
211 6656 validateRPRPatternVarCount(pstate, (RPRPatternNode *) lfirst(lc), d23df91Row pattern recognition patch (parse/analysis).
212 3328 varNames); d23df91Row pattern recognition patch (parse/analysis).
213 3328 } d23df91Row pattern recognition patch (parse/analysis).
214 1422 break; d23df91Row pattern recognition patch (parse/analysis).
215 - } d23df91Row pattern recognition patch (parse/analysis).
216 3887 } d23df91Row pattern recognition patch (parse/analysis).
transformDefineClause() lines 238-367
Modified Lines Coverage: 39/39 lines (100.0%)
LineHitsSourceCommit
238 550 transformDefineClause(ParseState *pstate, WindowClause *wc, WindowDef *windef, d23df91Row pattern recognition patch (parse/analysis).
239 - List **targetlist) d23df91Row pattern recognition patch (parse/analysis).
240 - { d23df91Row pattern recognition patch (parse/analysis).
241 550 ListCell *lc, d23df91Row pattern recognition patch (parse/analysis).
242 - *l; d23df91Row pattern recognition patch (parse/analysis).
243 550 ResTarget *restarget, d23df91Row pattern recognition patch (parse/analysis).
244 - *r; d23df91Row pattern recognition patch (parse/analysis).
245 550 List *restargets; d23df91Row pattern recognition patch (parse/analysis).
246 550 List *defineClause = NIL; d23df91Row pattern recognition patch (parse/analysis).
247 550 char *name; d23df91Row pattern recognition patch (parse/analysis).
248 550 List *patternVarNames = NIL; d23df91Row pattern recognition patch (parse/analysis).
249 - d23df91Row pattern recognition patch (parse/analysis).
250 - /* d23df91Row pattern recognition patch (parse/analysis).
251 - * If Row Definition Common Syntax exists, DEFINE clause must exist. (the d23df91Row pattern recognition patch (parse/analysis).
252 - * raw parser should have already checked it.) d23df91Row pattern recognition patch (parse/analysis).
253 - */ d23df91Row pattern recognition patch (parse/analysis).
254 550 Assert(windef->rpCommonSyntax->rpDefs != NULL); d23df91Row pattern recognition patch (parse/analysis).
255 - d23df91Row pattern recognition patch (parse/analysis).
256 - /* Validate PATTERN variable count (max RPR_VARID_MAX) */ d23df91Row pattern recognition patch (parse/analysis).
257 550 validateRPRPatternVarCount(pstate, windef->rpCommonSyntax->rpPattern, d23df91Row pattern recognition patch (parse/analysis).
258 - &patternVarNames); d23df91Row pattern recognition patch (parse/analysis).
259 - d23df91Row pattern recognition patch (parse/analysis).
260 - /* d23df91Row pattern recognition patch (parse/analysis).
261 - * Check for duplicate row pattern definition variables. The standard d23df91Row pattern recognition patch (parse/analysis).
262 - * requires that no two row pattern definition variable names shall be d23df91Row pattern recognition patch (parse/analysis).
263 - * equivalent. d23df91Row pattern recognition patch (parse/analysis).
264 - */ d23df91Row pattern recognition patch (parse/analysis).
265 550 restargets = NIL; d23df91Row pattern recognition patch (parse/analysis).
266 2300 foreach(lc, windef->rpCommonSyntax->rpDefs) d23df91Row pattern recognition patch (parse/analysis).
267 - { d23df91Row pattern recognition patch (parse/analysis).
268 1752 TargetEntry *te, d23df91Row pattern recognition patch (parse/analysis).
269 - *teDefine; d23df91Row pattern recognition patch (parse/analysis).
270 - d23df91Row pattern recognition patch (parse/analysis).
271 1752 restarget = (ResTarget *) lfirst(lc); d23df91Row pattern recognition patch (parse/analysis).
272 1752 name = restarget->name; d23df91Row pattern recognition patch (parse/analysis).
273 - d23df91Row pattern recognition patch (parse/analysis).
274 66517 foreach(l, restargets) d23df91Row pattern recognition patch (parse/analysis).
275 - { d23df91Row pattern recognition patch (parse/analysis).
276 64767 char *n; d23df91Row pattern recognition patch (parse/analysis).
277 - d23df91Row pattern recognition patch (parse/analysis).
278 64767 r = (ResTarget *) lfirst(l); d23df91Row pattern recognition patch (parse/analysis).
279 64767 n = r->name; d23df91Row pattern recognition patch (parse/analysis).
280 - d23df91Row pattern recognition patch (parse/analysis).
281 64767 if (!strcmp(n, name)) d23df91Row pattern recognition patch (parse/analysis).
282 2 ereport(ERROR, d23df91Row pattern recognition patch (parse/analysis).
283 - (errcode(ERRCODE_SYNTAX_ERROR), d23df91Row pattern recognition patch (parse/analysis).
284 - errmsg("row pattern definition variable name \"%s\" appears more than once in DEFINE clause", d23df91Row pattern recognition patch (parse/analysis).
285 - name), d23df91Row pattern recognition patch (parse/analysis).
286 - parser_errposition(pstate, exprLocation((Node *) r)))); d23df91Row pattern recognition patch (parse/analysis).
287 64765 } d23df91Row pattern recognition patch (parse/analysis).
288 - d23df91Row pattern recognition patch (parse/analysis).
289 1750 restargets = lappend(restargets, restarget); d23df91Row pattern recognition patch (parse/analysis).
290 - d23df91Row pattern recognition patch (parse/analysis).
291 - /* d23df91Row pattern recognition patch (parse/analysis).
292 - * Add DEFINE expression (Restarget->val) to the targetlist as a d23df91Row pattern recognition patch (parse/analysis).
293 - * TargetEntry if it does not exist yet. Planner will add the column d23df91Row pattern recognition patch (parse/analysis).
294 - * ref var node to the outer plan's target list later on. This makes d23df91Row pattern recognition patch (parse/analysis).
295 - * DEFINE expression could access the outer tuple while evaluating d23df91Row pattern recognition patch (parse/analysis).
296 - * PATTERN. d23df91Row pattern recognition patch (parse/analysis).
297 - * d23df91Row pattern recognition patch (parse/analysis).
298 - * Note: findTargetlistEntrySQL99 does Expr transformation and clobber d23df91Row pattern recognition patch (parse/analysis).
299 - * restarget->val. d23df91Row pattern recognition patch (parse/analysis).
300 - */ d23df91Row pattern recognition patch (parse/analysis).
301 - d23df91Row pattern recognition patch (parse/analysis).
302 - /* d23df91Row pattern recognition patch (parse/analysis).
303 - * Save the original expression location before transformation. d23df91Row pattern recognition patch (parse/analysis).
304 - * findTargetlistEntrySQL99 may return an existing TargetEntry whose d23df91Row pattern recognition patch (parse/analysis).
305 - * location points to where it was originally created (e.g., ORDER d23df91Row pattern recognition patch (parse/analysis).
306 - * BY), not the DEFINE clause. We need to preserve the DEFINE location d23df91Row pattern recognition patch (parse/analysis).
307 - * for accurate error reporting. d23df91Row pattern recognition patch (parse/analysis).
308 - */ d23df91Row pattern recognition patch (parse/analysis).
309 - { d23df91Row pattern recognition patch (parse/analysis).
310 1750 int defineExprLocation = exprLocation(restarget->val); d23df91Row pattern recognition patch (parse/analysis).
311 - d23df91Row pattern recognition patch (parse/analysis).
312 3500 te = findTargetlistEntrySQL99(pstate, restarget->val, d23df91Row pattern recognition patch (parse/analysis).
313 1750 targetlist, EXPR_KIND_RPR_DEFINE); d23df91Row pattern recognition patch (parse/analysis).
314 - d23df91Row pattern recognition patch (parse/analysis).
315 - /* ------------------- d23df91Row pattern recognition patch (parse/analysis).
316 - * Copy the TargetEntry for defineClause and always set the pattern d23df91Row pattern recognition patch (parse/analysis).
317 - * variable name. We use copyObject so the original targetlist entry d23df91Row pattern recognition patch (parse/analysis).
318 - * is not modified. d23df91Row pattern recognition patch (parse/analysis).
319 - * d23df91Row pattern recognition patch (parse/analysis).
320 - * Note: We must always set resname to the pattern variable name. d23df91Row pattern recognition patch (parse/analysis).
321 - * findTargetlistEntrySQL99 creates new TEs with resname = NULL d23df91Row pattern recognition patch (parse/analysis).
322 - * (resjunk entries), but returns existing TEs unchanged when the d23df91Row pattern recognition patch (parse/analysis).
323 - * expression already exists in targetlist. d23df91Row pattern recognition patch (parse/analysis).
324 - * d23df91Row pattern recognition patch (parse/analysis).
325 - * Example: "SELECT id, flag, ... WINDOW w AS (... DEFINE T AS flag)" d23df91Row pattern recognition patch (parse/analysis).
326 - * d23df91Row pattern recognition patch (parse/analysis).
327 - * 1. SELECT list processing creates: TE{resname="flag", expr=flag} d23df91Row pattern recognition patch (parse/analysis).
328 - * 2. DEFINE T AS flag: findTargetlistEntrySQL99 finds existing TE d23df91Row pattern recognition patch (parse/analysis).
329 - * 3. te->resname is "flag" (from SELECT), not NULL d23df91Row pattern recognition patch (parse/analysis).
330 - * 4. Without unconditionally setting resname, teDefine->resname d23df91Row pattern recognition patch (parse/analysis).
331 - * would remain "flag" instead of pattern variable name "T" d23df91Row pattern recognition patch (parse/analysis).
332 - * 5. buildRPRPattern builds defineVariableList from resname, so d23df91Row pattern recognition patch (parse/analysis).
333 - * it would contain ["flag"] instead of ["T"] d23df91Row pattern recognition patch (parse/analysis).
334 - * 6. Pattern variable "T" not found -> Assert failure crash d23df91Row pattern recognition patch (parse/analysis).
335 - */ d23df91Row pattern recognition patch (parse/analysis).
336 1750 teDefine = copyObject(te); d23df91Row pattern recognition patch (parse/analysis).
337 1750 teDefine->resname = pstrdup(name); d23df91Row pattern recognition patch (parse/analysis).
338 - d23df91Row pattern recognition patch (parse/analysis).
339 - /* d23df91Row pattern recognition patch (parse/analysis).
340 - * Update the expression location to point to the DEFINE clause. d23df91Row pattern recognition patch (parse/analysis).
341 - * This ensures error messages reference the correct source d23df91Row pattern recognition patch (parse/analysis).
342 - * location. d23df91Row pattern recognition patch (parse/analysis).
343 - */ d23df91Row pattern recognition patch (parse/analysis).
344 1750 if (defineExprLocation >= 0 && IsA(teDefine->expr, Var)) d23df91Row pattern recognition patch (parse/analysis).
345 2 ((Var *) teDefine->expr)->location = defineExprLocation; d23df91Row pattern recognition patch (parse/analysis).
346 1750 } d23df91Row pattern recognition patch (parse/analysis).
347 - d23df91Row pattern recognition patch (parse/analysis).
348 - /* build transformed DEFINE clause (list of TargetEntry) */ d23df91Row pattern recognition patch (parse/analysis).
349 1750 defineClause = lappend(defineClause, teDefine); d23df91Row pattern recognition patch (parse/analysis).
350 1750 } d23df91Row pattern recognition patch (parse/analysis).
351 548 list_free(restargets); d23df91Row pattern recognition patch (parse/analysis).
352 - d23df91Row pattern recognition patch (parse/analysis).
353 - /* d23df91Row pattern recognition patch (parse/analysis).
354 - * Make sure that the row pattern definition search condition is a boolean d23df91Row pattern recognition patch (parse/analysis).
355 - * expression. d23df91Row pattern recognition patch (parse/analysis).
356 - */ d23df91Row pattern recognition patch (parse/analysis).
357 2830 foreach_ptr(TargetEntry, te, defineClause) d23df91Row pattern recognition patch (parse/analysis).
358 2282 (void) coerce_to_boolean(pstate, (Node *) te->expr, "DEFINE"); d23df91Row pattern recognition patch (parse/analysis).
359 - d23df91Row pattern recognition patch (parse/analysis).
360 - /* mark column origins */ d23df91Row pattern recognition patch (parse/analysis).
361 548 markTargetListOrigins(pstate, defineClause); d23df91Row pattern recognition patch (parse/analysis).
362 - d23df91Row pattern recognition patch (parse/analysis).
363 - /* mark all nodes in the DEFINE clause tree with collation information */ d23df91Row pattern recognition patch (parse/analysis).
364 548 assign_expr_collations(pstate, (Node *) defineClause); d23df91Row pattern recognition patch (parse/analysis).
365 - d23df91Row pattern recognition patch (parse/analysis).
366 1096 return defineClause; d23df91Row pattern recognition patch (parse/analysis).
367 548 } d23df91Row pattern recognition patch (parse/analysis).