← Back to Overview

src/backend/optimizer/plan/rpr.c

Coverage: 570/575 lines (99.1%)
Total Lines
575
modified
Covered
570
99.1%
Uncovered
5
0.9%
Keyboard navigation
rprPatternEqual() lines 100-126
Modified Lines Coverage: 10/11 lines (90.9%)
LineHitsSourceCommit
100 1910 rprPatternEqual(RPRPatternNode *a, RPRPatternNode *b) 7521a30Row pattern recognition patch (planner).
101 - { 7521a30Row pattern recognition patch (planner).
102 - /* Pattern nodes in children lists must never be NULL */ 7521a30Row pattern recognition patch (planner).
103 1910 Assert(a != NULL && b != NULL); 7521a30Row pattern recognition patch (planner).
104 - 7521a30Row pattern recognition patch (planner).
105 - /* Must have same node type and quantifiers */ 7521a30Row pattern recognition patch (planner).
106 1910 if (a->nodeType != b->nodeType) 7521a30Row pattern recognition patch (planner).
107 - return false; 7521a30Row pattern recognition patch (planner).
108 1605 if (a->min != b->min || a->max != b->max) 7521a30Row pattern recognition patch (planner).
109 - return false; 7521a30Row pattern recognition patch (planner).
110 1510 if (a->reluctant != b->reluctant) 7521a30Row pattern recognition patch (planner).
111 - return false; 7521a30Row pattern recognition patch (planner).
112 - 7521a30Row pattern recognition patch (planner).
113 1505 switch (a->nodeType) 7521a30Row pattern recognition patch (planner).
114 - { 7521a30Row pattern recognition patch (planner).
115 1345 case RPR_PATTERN_VAR: 7521a30Row pattern recognition patch (planner).
116 1345 return strcmp(a->varName, b->varName) == 0; 7521a30Row pattern recognition patch (planner).
117 - 7521a30Row pattern recognition patch (planner).
118 160 case RPR_PATTERN_SEQ: 7521a30Row pattern recognition patch (planner).
119 - case RPR_PATTERN_ALT: 7521a30Row pattern recognition patch (planner).
120 - case RPR_PATTERN_GROUP: 7521a30Row pattern recognition patch (planner).
121 160 return rprPatternChildrenEqual(a->children, b->children); 7521a30Row pattern recognition patch (planner).
122 - } 7521a30Row pattern recognition patch (planner).
123 - 7521a30Row pattern recognition patch (planner).
124 0 pg_unreachable(); 7521a30Row pattern recognition patch (planner).
125 - return false; 7521a30Row pattern recognition patch (planner).
126 - } 7521a30Row pattern recognition patch (planner).
rprPatternChildrenEqual() lines 135-151
Modified Lines Coverage: 8/8 lines (100.0%)
LineHitsSourceCommit
135 535 rprPatternChildrenEqual(List *a, List *b) 7521a30Row pattern recognition patch (planner).
136 - { 7521a30Row pattern recognition patch (planner).
137 535 ListCell *lca, 7521a30Row pattern recognition patch (planner).
138 - *lcb; 7521a30Row pattern recognition patch (planner).
139 - 7521a30Row pattern recognition patch (planner).
140 1605 if (list_length(a) != list_length(b)) 7521a30Row pattern recognition patch (planner).
141 - return false; 7521a30Row pattern recognition patch (planner).
142 - 7521a30Row pattern recognition patch (planner).
143 960 forboth(lca, a, lcb, b) 7521a30Row pattern recognition patch (planner).
144 - { 7521a30Row pattern recognition patch (planner).
145 690 if (!rprPatternEqual((RPRPatternNode *) lfirst(lca), 7521a30Row pattern recognition patch (planner).
146 690 (RPRPatternNode *) lfirst(lcb))) 7521a30Row pattern recognition patch (planner).
147 185 return false; 7521a30Row pattern recognition patch (planner).
148 - } 7521a30Row pattern recognition patch (planner).
149 - 7521a30Row pattern recognition patch (planner).
150 270 return true; 7521a30Row pattern recognition patch (planner).
151 - } 7521a30Row pattern recognition patch (planner).
flattenSeqChildren() lines 164-188
Modified Lines Coverage: 10/10 lines (100.0%)
LineHitsSourceCommit
164 2769 flattenSeqChildren(List *children) 7521a30Row pattern recognition patch (planner).
165 - { 7521a30Row pattern recognition patch (planner).
166 2769 List *newChildren = NIL; 7521a30Row pattern recognition patch (planner).
167 - 7521a30Row pattern recognition patch (planner).
168 305442 foreach_node(RPRPatternNode, child, children) 7521a30Row pattern recognition patch (planner).
169 - { 7521a30Row pattern recognition patch (planner).
170 302673 RPRPatternNode *opt = optimizeRPRPattern(child); 7521a30Row pattern recognition patch (planner).
171 - 7521a30Row pattern recognition patch (planner).
172 - /* GROUP{1,1} should have been unwrapped by optimizeGroupPattern */ 7521a30Row pattern recognition patch (planner).
173 302673 Assert(!(opt->nodeType == RPR_PATTERN_GROUP && 7521a30Row pattern recognition patch (planner).
174 - opt->min == 1 && opt->max == 1 && opt->reluctant == false)); 7521a30Row pattern recognition patch (planner).
175 - 7521a30Row pattern recognition patch (planner).
176 302673 if (opt->nodeType == RPR_PATTERN_SEQ) 7521a30Row pattern recognition patch (planner).
177 - { 7521a30Row pattern recognition patch (planner).
178 50 newChildren = list_concat(newChildren, 7521a30Row pattern recognition patch (planner).
179 50 list_copy(opt->children)); 7521a30Row pattern recognition patch (planner).
180 - } 7521a30Row pattern recognition patch (planner).
181 - else 7521a30Row pattern recognition patch (planner).
182 - { 7521a30Row pattern recognition patch (planner).
183 302623 newChildren = lappend(newChildren, opt); 7521a30Row pattern recognition patch (planner).
184 - } 7521a30Row pattern recognition patch (planner).
185 - } 7521a30Row pattern recognition patch (planner).
186 - 7521a30Row pattern recognition patch (planner).
187 2769 return newChildren; 7521a30Row pattern recognition patch (planner).
188 - } 7521a30Row pattern recognition patch (planner).
mergeConsecutiveVars() lines 200-262
Modified Lines Coverage: 23/23 lines (100.0%)
LineHitsSourceCommit
200 2769 mergeConsecutiveVars(List *children) 7521a30Row pattern recognition patch (planner).
201 - { 7521a30Row pattern recognition patch (planner).
202 2769 List *mergedChildren = NIL; 7521a30Row pattern recognition patch (planner).
203 2769 RPRPatternNode *prev = NULL; 7521a30Row pattern recognition patch (planner).
204 - 7521a30Row pattern recognition patch (planner).
205 305492 foreach_node(RPRPatternNode, child, children) 7521a30Row pattern recognition patch (planner).
206 - { 7521a30Row pattern recognition patch (planner).
207 302723 if (child->nodeType == RPR_PATTERN_VAR && child->reluctant == false) 7521a30Row pattern recognition patch (planner).
208 - { 7521a30Row pattern recognition patch (planner).
209 - /* ---------------------- 7521a30Row pattern recognition patch (planner).
210 - * Can merge consecutive VAR nodes if: 7521a30Row pattern recognition patch (planner).
211 - * 1. Same variable name 7521a30Row pattern recognition patch (planner).
212 - * 2. No min overflow: prev->min + child->min < INF 7521a30Row pattern recognition patch (planner).
213 - * 3. No max overflow: prev->max + child->max < INF (or either is INF) 7521a30Row pattern recognition patch (planner).
214 - * 7521a30Row pattern recognition patch (planner).
215 - * Strict <: a sum equal to INF would alias the unbounded sentinel 7521a30Row pattern recognition patch (planner).
216 - * (min must stay finite; a finite max must not become INF). 7521a30Row pattern recognition patch (planner).
217 - */ 7521a30Row pattern recognition patch (planner).
218 301843 if (prev != NULL && 7521a30Row pattern recognition patch (planner).
219 299074 strcmp(prev->varName, child->varName) == 0 && 7521a30Row pattern recognition patch (planner).
220 125 prev->min < RPR_QUANTITY_INF - child->min && 7521a30Row pattern recognition patch (planner).
221 120 (prev->max < RPR_QUANTITY_INF - child->max || 7521a30Row pattern recognition patch (planner).
222 10 prev->max == RPR_QUANTITY_INF || 7521a30Row pattern recognition patch (planner).
223 - child->max == RPR_QUANTITY_INF)) 7521a30Row pattern recognition patch (planner).
224 - { 7521a30Row pattern recognition patch (planner).
225 - /* 7521a30Row pattern recognition patch (planner).
226 - * Merge: accumulate min/max into prev. prev is guaranteed to 7521a30Row pattern recognition patch (planner).
227 - * be a non-reluctant VAR by the outer condition. 7521a30Row pattern recognition patch (planner).
228 - */ 7521a30Row pattern recognition patch (planner).
229 120 Assert(prev->nodeType == RPR_PATTERN_VAR && prev->reluctant == false); 7521a30Row pattern recognition patch (planner).
230 - 7521a30Row pattern recognition patch (planner).
231 120 prev->min += child->min; 7521a30Row pattern recognition patch (planner).
232 - 7521a30Row pattern recognition patch (planner).
233 120 if (prev->max == RPR_QUANTITY_INF || 7521a30Row pattern recognition patch (planner).
234 95 child->max == RPR_QUANTITY_INF) 7521a30Row pattern recognition patch (planner).
235 35 prev->max = RPR_QUANTITY_INF; 7521a30Row pattern recognition patch (planner).
236 - else 7521a30Row pattern recognition patch (planner).
237 85 prev->max += child->max; 7521a30Row pattern recognition patch (planner).
238 - } 7521a30Row pattern recognition patch (planner).
239 - else 7521a30Row pattern recognition patch (planner).
240 - { 7521a30Row pattern recognition patch (planner).
241 - /* Flush previous and start new */ 7521a30Row pattern recognition patch (planner).
242 - if (prev != NULL) 7521a30Row pattern recognition patch (planner).
243 298954 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
244 - prev = child; 7521a30Row pattern recognition patch (planner).
245 - } 7521a30Row pattern recognition patch (planner).
246 - } 7521a30Row pattern recognition patch (planner).
247 - else 7521a30Row pattern recognition patch (planner).
248 - { 7521a30Row pattern recognition patch (planner).
249 - /* Non-mergeable - flush previous */ 7521a30Row pattern recognition patch (planner).
250 880 if (prev != NULL) 7521a30Row pattern recognition patch (planner).
251 270 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
252 880 mergedChildren = lappend(mergedChildren, child); 7521a30Row pattern recognition patch (planner).
253 - prev = NULL; 7521a30Row pattern recognition patch (planner).
254 - } 7521a30Row pattern recognition patch (planner).
255 - } 7521a30Row pattern recognition patch (planner).
256 - 7521a30Row pattern recognition patch (planner).
257 - /* Flush remaining */ 7521a30Row pattern recognition patch (planner).
258 2769 if (prev != NULL) 7521a30Row pattern recognition patch (planner).
259 2499 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
260 - 7521a30Row pattern recognition patch (planner).
261 2769 return mergedChildren; 7521a30Row pattern recognition patch (planner).
262 - } 7521a30Row pattern recognition patch (planner).
mergeConsecutiveGroups() lines 274-336
Modified Lines Coverage: 23/23 lines (100.0%)
LineHitsSourceCommit
274 2769 mergeConsecutiveGroups(List *children) 7521a30Row pattern recognition patch (planner).
275 - { 7521a30Row pattern recognition patch (planner).
276 2769 List *mergedChildren = NIL; 7521a30Row pattern recognition patch (planner).
277 2769 RPRPatternNode *prev = NULL; 7521a30Row pattern recognition patch (planner).
278 - 7521a30Row pattern recognition patch (planner).
279 305372 foreach_node(RPRPatternNode, child, children) 7521a30Row pattern recognition patch (planner).
280 - { 7521a30Row pattern recognition patch (planner).
281 302603 if (child->nodeType == RPR_PATTERN_GROUP && child->reluctant == false) 7521a30Row pattern recognition patch (planner).
282 - { 7521a30Row pattern recognition patch (planner).
283 - /* ---------------------- 7521a30Row pattern recognition patch (planner).
284 - * Can merge consecutive GROUP nodes if: 7521a30Row pattern recognition patch (planner).
285 - * 1. Identical children 7521a30Row pattern recognition patch (planner).
286 - * 2. No min overflow: prev->min + child->min < INF 7521a30Row pattern recognition patch (planner).
287 - * 3. No max overflow: prev->max + child->max < INF (or either is INF) 7521a30Row pattern recognition patch (planner).
288 - * 7521a30Row pattern recognition patch (planner).
289 - * Strict <: a sum equal to INF would alias the unbounded sentinel 7521a30Row pattern recognition patch (planner).
290 - * (min must stay finite; a finite max must not become INF). 7521a30Row pattern recognition patch (planner).
291 - */ 7521a30Row pattern recognition patch (planner).
292 385 if (prev != NULL && 7521a30Row pattern recognition patch (planner).
293 40 rprPatternChildrenEqual(prev->children, child->children) && 7521a30Row pattern recognition patch (planner).
294 25 prev->min < RPR_QUANTITY_INF - child->min && 7521a30Row pattern recognition patch (planner).
295 20 (prev->max < RPR_QUANTITY_INF - child->max || 7521a30Row pattern recognition patch (planner).
296 5 prev->max == RPR_QUANTITY_INF || 7521a30Row pattern recognition patch (planner).
297 - child->max == RPR_QUANTITY_INF)) 7521a30Row pattern recognition patch (planner).
298 - { 7521a30Row pattern recognition patch (planner).
299 - /* 7521a30Row pattern recognition patch (planner).
300 - * Merge: accumulate min/max into prev. prev is guaranteed to 7521a30Row pattern recognition patch (planner).
301 - * be a non-reluctant GROUP by the outer condition. 7521a30Row pattern recognition patch (planner).
302 - */ 7521a30Row pattern recognition patch (planner).
303 20 Assert(prev->nodeType == RPR_PATTERN_GROUP && prev->reluctant == false); 7521a30Row pattern recognition patch (planner).
304 - 7521a30Row pattern recognition patch (planner).
305 20 prev->min += child->min; 7521a30Row pattern recognition patch (planner).
306 - 7521a30Row pattern recognition patch (planner).
307 20 if (prev->max == RPR_QUANTITY_INF || 7521a30Row pattern recognition patch (planner).
308 10 child->max == RPR_QUANTITY_INF) 7521a30Row pattern recognition patch (planner).
309 15 prev->max = RPR_QUANTITY_INF; 7521a30Row pattern recognition patch (planner).
310 - else 7521a30Row pattern recognition patch (planner).
311 5 prev->max += child->max; 7521a30Row pattern recognition patch (planner).
312 - } 7521a30Row pattern recognition patch (planner).
313 - else 7521a30Row pattern recognition patch (planner).
314 - { 7521a30Row pattern recognition patch (planner).
315 - /* Flush previous and start new */ 7521a30Row pattern recognition patch (planner).
316 - if (prev != NULL) 7521a30Row pattern recognition patch (planner).
317 20 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
318 - prev = child; 7521a30Row pattern recognition patch (planner).
319 - } 7521a30Row pattern recognition patch (planner).
320 - } 7521a30Row pattern recognition patch (planner).
321 - else 7521a30Row pattern recognition patch (planner).
322 - { 7521a30Row pattern recognition patch (planner).
323 - /* Non-mergeable - flush previous */ 7521a30Row pattern recognition patch (planner).
324 302258 if (prev != NULL) 7521a30Row pattern recognition patch (planner).
325 190 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
326 302258 mergedChildren = lappend(mergedChildren, child); 7521a30Row pattern recognition patch (planner).
327 - prev = NULL; 7521a30Row pattern recognition patch (planner).
328 - } 7521a30Row pattern recognition patch (planner).
329 - } 7521a30Row pattern recognition patch (planner).
330 - 7521a30Row pattern recognition patch (planner).
331 - /* Flush remaining */ 7521a30Row pattern recognition patch (planner).
332 2769 if (prev != NULL) 7521a30Row pattern recognition patch (planner).
333 115 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
334 - 7521a30Row pattern recognition patch (planner).
335 2769 return mergedChildren; 7521a30Row pattern recognition patch (planner).
336 - } 7521a30Row pattern recognition patch (planner).
mergeConsecutiveAlts() lines 350-437
Modified Lines Coverage: 44/44 lines (100.0%)
LineHitsSourceCommit
350 2769 mergeConsecutiveAlts(List *children) 7521a30Row pattern recognition patch (planner).
351 - { 7521a30Row pattern recognition patch (planner).
352 2769 List *mergedChildren = NIL; 7521a30Row pattern recognition patch (planner).
353 2769 RPRPatternNode *prev = NULL; 7521a30Row pattern recognition patch (planner).
354 2769 int count = 0; 7521a30Row pattern recognition patch (planner).
355 - 7521a30Row pattern recognition patch (planner).
356 305352 foreach_node(RPRPatternNode, child, children) 7521a30Row pattern recognition patch (planner).
357 - { 7521a30Row pattern recognition patch (planner).
358 302583 if (child->nodeType == RPR_PATTERN_ALT && child->reluctant == false) 7521a30Row pattern recognition patch (planner).
359 - { 7521a30Row pattern recognition patch (planner).
360 540 if (prev != NULL && 7521a30Row pattern recognition patch (planner).
361 120 rprPatternChildrenEqual(prev->children, child->children)) 7521a30Row pattern recognition patch (planner).
362 - { 7521a30Row pattern recognition patch (planner).
363 - /* Same ALT as prev - accumulate */ 7521a30Row pattern recognition patch (planner).
364 80 count++; 7521a30Row pattern recognition patch (planner).
365 - } 7521a30Row pattern recognition patch (planner).
366 - else 7521a30Row pattern recognition patch (planner).
367 - { 7521a30Row pattern recognition patch (planner).
368 - /* Different ALT or first ALT - flush previous */ 7521a30Row pattern recognition patch (planner).
369 40 if (prev != NULL) 7521a30Row pattern recognition patch (planner).
370 - { 7521a30Row pattern recognition patch (planner).
371 40 if (count > 1) 7521a30Row pattern recognition patch (planner).
372 - { 7521a30Row pattern recognition patch (planner).
373 - /* Wrap in GROUP{count,count}(ALT) */ 7521a30Row pattern recognition patch (planner).
374 5 RPRPatternNode *group = makeNode(RPRPatternNode); 7521a30Row pattern recognition patch (planner).
375 - 7521a30Row pattern recognition patch (planner).
376 5 group->nodeType = RPR_PATTERN_GROUP; 7521a30Row pattern recognition patch (planner).
377 5 group->min = count; 7521a30Row pattern recognition patch (planner).
378 5 group->max = count; 7521a30Row pattern recognition patch (planner).
379 5 group->reluctant = false; 7521a30Row pattern recognition patch (planner).
380 5 group->location = -1; 7521a30Row pattern recognition patch (planner).
381 5 group->children = list_make1(prev); 7521a30Row pattern recognition patch (planner).
382 5 mergedChildren = lappend(mergedChildren, group); 7521a30Row pattern recognition patch (planner).
383 - } 7521a30Row pattern recognition patch (planner).
384 - else 7521a30Row pattern recognition patch (planner).
385 35 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
386 - } 7521a30Row pattern recognition patch (planner).
387 - prev = child; 7521a30Row pattern recognition patch (planner).
388 - count = 1; 7521a30Row pattern recognition patch (planner).
389 - } 7521a30Row pattern recognition patch (planner).
390 - } 7521a30Row pattern recognition patch (planner).
391 - else 7521a30Row pattern recognition patch (planner).
392 - { 7521a30Row pattern recognition patch (planner).
393 - /* Non-ALT - flush previous */ 7521a30Row pattern recognition patch (planner).
394 302163 if (prev != NULL) 7521a30Row pattern recognition patch (planner).
395 - { 7521a30Row pattern recognition patch (planner).
396 160 if (count > 1) 7521a30Row pattern recognition patch (planner).
397 - { 7521a30Row pattern recognition patch (planner).
398 5 RPRPatternNode *group = makeNode(RPRPatternNode); 7521a30Row pattern recognition patch (planner).
399 - 7521a30Row pattern recognition patch (planner).
400 5 group->nodeType = RPR_PATTERN_GROUP; 7521a30Row pattern recognition patch (planner).
401 5 group->min = count; 7521a30Row pattern recognition patch (planner).
402 5 group->max = count; 7521a30Row pattern recognition patch (planner).
403 5 group->reluctant = false; 7521a30Row pattern recognition patch (planner).
404 5 group->location = -1; 7521a30Row pattern recognition patch (planner).
405 5 group->children = list_make1(prev); 7521a30Row pattern recognition patch (planner).
406 5 mergedChildren = lappend(mergedChildren, group); 7521a30Row pattern recognition patch (planner).
407 - } 7521a30Row pattern recognition patch (planner).
408 - else 7521a30Row pattern recognition patch (planner).
409 155 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
410 - } 7521a30Row pattern recognition patch (planner).
411 302163 mergedChildren = lappend(mergedChildren, child); 7521a30Row pattern recognition patch (planner).
412 - prev = NULL; 7521a30Row pattern recognition patch (planner).
413 - count = 0; 7521a30Row pattern recognition patch (planner).
414 - } 7521a30Row pattern recognition patch (planner).
415 - } 7521a30Row pattern recognition patch (planner).
416 - 7521a30Row pattern recognition patch (planner).
417 - /* Flush remaining */ 7521a30Row pattern recognition patch (planner).
418 2769 if (prev != NULL) 7521a30Row pattern recognition patch (planner).
419 - { 7521a30Row pattern recognition patch (planner).
420 140 if (count > 1) 7521a30Row pattern recognition patch (planner).
421 - { 7521a30Row pattern recognition patch (planner).
422 10 RPRPatternNode *group = makeNode(RPRPatternNode); 7521a30Row pattern recognition patch (planner).
423 - 7521a30Row pattern recognition patch (planner).
424 10 group->nodeType = RPR_PATTERN_GROUP; 7521a30Row pattern recognition patch (planner).
425 10 group->min = count; 7521a30Row pattern recognition patch (planner).
426 10 group->max = count; 7521a30Row pattern recognition patch (planner).
427 10 group->reluctant = false; 7521a30Row pattern recognition patch (planner).
428 10 group->location = -1; 7521a30Row pattern recognition patch (planner).
429 10 group->children = list_make1(prev); 7521a30Row pattern recognition patch (planner).
430 10 mergedChildren = lappend(mergedChildren, group); 7521a30Row pattern recognition patch (planner).
431 - } 7521a30Row pattern recognition patch (planner).
432 - else 7521a30Row pattern recognition patch (planner).
433 130 mergedChildren = lappend(mergedChildren, prev); 7521a30Row pattern recognition patch (planner).
434 - } 7521a30Row pattern recognition patch (planner).
435 - 7521a30Row pattern recognition patch (planner).
436 2769 return mergedChildren; 7521a30Row pattern recognition patch (planner).
437 - } 7521a30Row pattern recognition patch (planner).
mergeGroupPrefixSuffix() lines 462-614
Modified Lines Coverage: 59/59 lines (100.0%)
LineHitsSourceCommit
462 2769 mergeGroupPrefixSuffix(List *children) 7521a30Row pattern recognition patch (planner).
463 - { 7521a30Row pattern recognition patch (planner).
464 2769 List *result = NIL; 7521a30Row pattern recognition patch (planner).
465 2769 int numChildren = list_length(children); 7521a30Row pattern recognition patch (planner).
466 2769 int i; 7521a30Row pattern recognition patch (planner).
467 2769 int skipUntil = -1; /* skip suffix elements already merged */ 7521a30Row pattern recognition patch (planner).
468 - 7521a30Row pattern recognition patch (planner).
469 305162 for (i = 0; i < numChildren; i++) 7521a30Row pattern recognition patch (planner).
470 - { 7521a30Row pattern recognition patch (planner).
471 302393 RPRPatternNode *child = (RPRPatternNode *) list_nth(children, i); 7521a30Row pattern recognition patch (planner).
472 - 7521a30Row pattern recognition patch (planner).
473 - /* 7521a30Row pattern recognition patch (planner).
474 - * The suffix merge logic below adjusts i to skip merged elements, 7521a30Row pattern recognition patch (planner).
475 - * ensuring we never revisit them. Verify this invariant. 7521a30Row pattern recognition patch (planner).
476 - */ 7521a30Row pattern recognition patch (planner).
477 302393 Assert(i >= skipUntil); 7521a30Row pattern recognition patch (planner).
478 - 7521a30Row pattern recognition patch (planner).
479 - /* 7521a30Row pattern recognition patch (planner).
480 - * If this is a GROUP, see if preceding/following elements match its 7521a30Row pattern recognition patch (planner).
481 - * children. GROUP's content may be wrapped in a SEQ - unwrap for 7521a30Row pattern recognition patch (planner).
482 - * comparison. 7521a30Row pattern recognition patch (planner).
483 - */ 7521a30Row pattern recognition patch (planner).
484 302393 if (child->nodeType == RPR_PATTERN_GROUP && child->reluctant == false) 7521a30Row pattern recognition patch (planner).
485 - { 7521a30Row pattern recognition patch (planner).
486 345 List *groupContent = child->children; 7521a30Row pattern recognition patch (planner).
487 345 int groupChildCount; 7521a30Row pattern recognition patch (planner).
488 345 int prefixLen = list_length(result); 7521a30Row pattern recognition patch (planner).
489 345 List *trimmed; 7521a30Row pattern recognition patch (planner).
490 - 7521a30Row pattern recognition patch (planner).
491 - /* 7521a30Row pattern recognition patch (planner).
492 - * If GROUP has single SEQ child, compare with SEQ's children. 7521a30Row pattern recognition patch (planner).
493 - * e.g., (A B)+ internally contains sequence A B; compare against 7521a30Row pattern recognition patch (planner).
494 - * that. 7521a30Row pattern recognition patch (planner).
495 - */ 7521a30Row pattern recognition patch (planner).
496 345 if (list_length(groupContent) == 1) 7521a30Row pattern recognition patch (planner).
497 - { 7521a30Row pattern recognition patch (planner).
498 345 RPRPatternNode *inner = (RPRPatternNode *) linitial(groupContent); 7521a30Row pattern recognition patch (planner).
499 - 7521a30Row pattern recognition patch (planner).
500 345 if (inner->nodeType == RPR_PATTERN_SEQ) 7521a30Row pattern recognition patch (planner).
501 260 groupContent = inner->children; 7521a30Row pattern recognition patch (planner).
502 - } 7521a30Row pattern recognition patch (planner).
503 - 7521a30Row pattern recognition patch (planner).
504 345 groupChildCount = list_length(groupContent); 7521a30Row pattern recognition patch (planner).
505 - 7521a30Row pattern recognition patch (planner).
506 - /* 7521a30Row pattern recognition patch (planner).
507 - * PREFIX MERGE: Check if preceding elements match. Keep merging 7521a30Row pattern recognition patch (planner).
508 - * as long as we have matching prefixes. 7521a30Row pattern recognition patch (planner).
509 - */ 7521a30Row pattern recognition patch (planner).
510 405 while (prefixLen >= groupChildCount && groupChildCount > 0) 7521a30Row pattern recognition patch (planner).
511 - { 7521a30Row pattern recognition patch (planner).
512 95 List *prefixElements = NIL; 7521a30Row pattern recognition patch (planner).
513 95 int j; 7521a30Row pattern recognition patch (planner).
514 - 7521a30Row pattern recognition patch (planner).
515 - /* Extract last groupChildCount elements from prefix */ 7521a30Row pattern recognition patch (planner).
516 265 for (j = prefixLen - groupChildCount; j < prefixLen; j++) 7521a30Row pattern recognition patch (planner).
517 - { 7521a30Row pattern recognition patch (planner).
518 170 prefixElements = lappend(prefixElements, 7521a30Row pattern recognition patch (planner).
519 - list_nth(result, j)); 7521a30Row pattern recognition patch (planner).
520 - } 7521a30Row pattern recognition patch (planner).
521 - 7521a30Row pattern recognition patch (planner).
522 - /* Compare with GROUP's (possibly unwrapped) children */ 7521a30Row pattern recognition patch (planner).
523 95 if (rprPatternChildrenEqual(prefixElements, groupContent) && 7521a30Row pattern recognition patch (planner).
524 60 child->min < RPR_QUANTITY_INF - 1 && 7521a30Row pattern recognition patch (planner).
525 60 (child->max == RPR_QUANTITY_INF || 7521a30Row pattern recognition patch (planner).
526 - child->max < RPR_QUANTITY_INF - 1)) 7521a30Row pattern recognition patch (planner).
527 - { 7521a30Row pattern recognition patch (planner).
528 - /* 7521a30Row pattern recognition patch (planner).
529 - * Match! Merge by incrementing GROUP's quantifier. Remove 7521a30Row pattern recognition patch (planner).
530 - * the prefix elements from output. 7521a30Row pattern recognition patch (planner).
531 - */ 7521a30Row pattern recognition patch (planner).
532 60 child->min += 1; 7521a30Row pattern recognition patch (planner).
533 60 if (child->max != RPR_QUANTITY_INF) 7521a30Row pattern recognition patch (planner).
534 5 child->max += 1; 7521a30Row pattern recognition patch (planner).
535 - 7521a30Row pattern recognition patch (planner).
536 - /* Rebuild result without matched prefix */ 7521a30Row pattern recognition patch (planner).
537 - trimmed = NIL; 7521a30Row pattern recognition patch (planner).
538 85 for (j = 0; j < prefixLen - groupChildCount; j++) 7521a30Row pattern recognition patch (planner).
539 - { 7521a30Row pattern recognition patch (planner).
540 25 trimmed = lappend(trimmed, 7521a30Row pattern recognition patch (planner).
541 - list_nth(result, j)); 7521a30Row pattern recognition patch (planner).
542 - } 7521a30Row pattern recognition patch (planner).
543 60 result = trimmed; 7521a30Row pattern recognition patch (planner).
544 60 prefixLen = list_length(result); 7521a30Row pattern recognition patch (planner).
545 - } 7521a30Row pattern recognition patch (planner).
546 - else 7521a30Row pattern recognition patch (planner).
547 - { 7521a30Row pattern recognition patch (planner).
548 35 list_free(prefixElements); 7521a30Row pattern recognition patch (planner).
549 35 break; 7521a30Row pattern recognition patch (planner).
550 - } 7521a30Row pattern recognition patch (planner).
551 - 7521a30Row pattern recognition patch (planner).
552 60 list_free(prefixElements); 7521a30Row pattern recognition patch (planner).
553 - } 7521a30Row pattern recognition patch (planner).
554 - 7521a30Row pattern recognition patch (planner).
555 - /* 7521a30Row pattern recognition patch (planner).
556 - * SUFFIX MERGE: Check if following elements match. Keep merging 7521a30Row pattern recognition patch (planner).
557 - * as long as we have matching suffixes. 7521a30Row pattern recognition patch (planner).
558 - */ 7521a30Row pattern recognition patch (planner).
559 405 while (i + groupChildCount < numChildren && groupChildCount > 0) 7521a30Row pattern recognition patch (planner).
560 - { 7521a30Row pattern recognition patch (planner).
561 120 List *suffixElements = NIL; 7521a30Row pattern recognition patch (planner).
562 120 int j; 7521a30Row pattern recognition patch (planner).
563 120 int suffixStart = i + 1; 7521a30Row pattern recognition patch (planner).
564 - 7521a30Row pattern recognition patch (planner).
565 - /* suffixStart always >= skipUntil after i adjustment */ 7521a30Row pattern recognition patch (planner).
566 120 Assert(skipUntil <= suffixStart); 7521a30Row pattern recognition patch (planner).
567 - 7521a30Row pattern recognition patch (planner).
568 - /* Extract next groupChildCount elements as suffix */ 7521a30Row pattern recognition patch (planner).
569 295 for (j = 0; j < groupChildCount; j++) 7521a30Row pattern recognition patch (planner).
570 - { 7521a30Row pattern recognition patch (planner).
571 175 int idx = suffixStart + j; 7521a30Row pattern recognition patch (planner).
572 - 7521a30Row pattern recognition patch (planner).
573 - /* while condition guarantees idx < numChildren */ 7521a30Row pattern recognition patch (planner).
574 175 Assert(idx < numChildren); 7521a30Row pattern recognition patch (planner).
575 175 suffixElements = lappend(suffixElements, 7521a30Row pattern recognition patch (planner).
576 - list_nth(children, idx)); 7521a30Row pattern recognition patch (planner).
577 - } 7521a30Row pattern recognition patch (planner).
578 - 7521a30Row pattern recognition patch (planner).
579 - /* Compare with GROUP's children */ 7521a30Row pattern recognition patch (planner).
580 360 if (list_length(suffixElements) == groupChildCount && 7521a30Row pattern recognition patch (planner).
581 120 rprPatternChildrenEqual(suffixElements, groupContent) && 7521a30Row pattern recognition patch (planner).
582 60 child->min < RPR_QUANTITY_INF - 1 && 7521a30Row pattern recognition patch (planner).
583 60 (child->max == RPR_QUANTITY_INF || 7521a30Row pattern recognition patch (planner).
584 - child->max < RPR_QUANTITY_INF - 1)) 7521a30Row pattern recognition patch (planner).
585 - { 7521a30Row pattern recognition patch (planner).
586 - /* 7521a30Row pattern recognition patch (planner).
587 - * Match! Merge suffix by incrementing quantifier and 7521a30Row pattern recognition patch (planner).
588 - * skipping. 7521a30Row pattern recognition patch (planner).
589 - */ 7521a30Row pattern recognition patch (planner).
590 60 child->min += 1; 7521a30Row pattern recognition patch (planner).
591 60 if (child->max != RPR_QUANTITY_INF) 7521a30Row pattern recognition patch (planner).
592 5 child->max += 1; 7521a30Row pattern recognition patch (planner).
593 60 skipUntil = suffixStart + groupChildCount; 7521a30Row pattern recognition patch (planner).
594 - 7521a30Row pattern recognition patch (planner).
595 - /* 7521a30Row pattern recognition patch (planner).
596 - * Update i to continue suffix check after merged elements 7521a30Row pattern recognition patch (planner).
597 - */ 7521a30Row pattern recognition patch (planner).
598 60 i = skipUntil - 1; 7521a30Row pattern recognition patch (planner).
599 - } 7521a30Row pattern recognition patch (planner).
600 - else 7521a30Row pattern recognition patch (planner).
601 - { 7521a30Row pattern recognition patch (planner).
602 60 list_free(suffixElements); 7521a30Row pattern recognition patch (planner).
603 60 break; 7521a30Row pattern recognition patch (planner).
604 - } 7521a30Row pattern recognition patch (planner).
605 - 7521a30Row pattern recognition patch (planner).
606 60 list_free(suffixElements); 7521a30Row pattern recognition patch (planner).
607 - } 7521a30Row pattern recognition patch (planner).
608 - } 7521a30Row pattern recognition patch (planner).
609 - 7521a30Row pattern recognition patch (planner).
610 302393 result = lappend(result, child); 7521a30Row pattern recognition patch (planner).
611 - } 7521a30Row pattern recognition patch (planner).
612 - 7521a30Row pattern recognition patch (planner).
613 2769 return result; 7521a30Row pattern recognition patch (planner).
614 - } 7521a30Row pattern recognition patch (planner).
optimizeSeqPattern() lines 629-651
Modified Lines Coverage: 8/8 lines (100.0%)
LineHitsSourceCommit
629 2769 optimizeSeqPattern(RPRPatternNode *pattern) 7521a30Row pattern recognition patch (planner).
630 - { 7521a30Row pattern recognition patch (planner).
631 - /* Recursively optimize children and flatten nested SEQ/GROUP{1,1} */ 7521a30Row pattern recognition patch (planner).
632 2769 pattern->children = flattenSeqChildren(pattern->children); 7521a30Row pattern recognition patch (planner).
633 - 7521a30Row pattern recognition patch (planner).
634 - /* Merge consecutive identical VAR nodes */ 7521a30Row pattern recognition patch (planner).
635 2769 pattern->children = mergeConsecutiveVars(pattern->children); 7521a30Row pattern recognition patch (planner).
636 - 7521a30Row pattern recognition patch (planner).
637 - /* Merge consecutive identical GROUP nodes */ 7521a30Row pattern recognition patch (planner).
638 2769 pattern->children = mergeConsecutiveGroups(pattern->children); 7521a30Row pattern recognition patch (planner).
639 - 7521a30Row pattern recognition patch (planner).
640 - /* Merge consecutive identical ALT nodes into GROUP */ 7521a30Row pattern recognition patch (planner).
641 2769 pattern->children = mergeConsecutiveAlts(pattern->children); 7521a30Row pattern recognition patch (planner).
642 - 7521a30Row pattern recognition patch (planner).
643 - /* Merge prefix/suffix into GROUP with matching children */ 7521a30Row pattern recognition patch (planner).
644 2769 pattern->children = mergeGroupPrefixSuffix(pattern->children); 7521a30Row pattern recognition patch (planner).
645 - 7521a30Row pattern recognition patch (planner).
646 - /* Unwrap single-item SEQ: SEQ[A] -> A */ 7512d22Simplify row pattern compilation by passing the WindowClause
647 2769 if (list_length(pattern->children) == 1) 7512d22Simplify row pattern compilation by passing the WindowClause
648 135 return (RPRPatternNode *) linitial(pattern->children); 7512d22Simplify row pattern compilation by passing the WindowClause
649 - 7512d22Simplify row pattern compilation by passing the WindowClause
650 - return pattern; 7512d22Simplify row pattern compilation by passing the WindowClause
651 - } 7521a30Row pattern recognition patch (planner).
flattenAltChildren() lines 664-679
Modified Lines Coverage: 8/8 lines (100.0%)
LineHitsSourceCommit
664 910 flattenAltChildren(List *children) 7521a30Row pattern recognition patch (planner).
665 - { 7521a30Row pattern recognition patch (planner).
666 910 List *newChildren = NIL; 7521a30Row pattern recognition patch (planner).
667 - 7521a30Row pattern recognition patch (planner).
668 2860 foreach_node(RPRPatternNode, child, children) 7521a30Row pattern recognition patch (planner).
669 - { 7521a30Row pattern recognition patch (planner).
670 1950 RPRPatternNode *opt = optimizeRPRPattern(child); 7521a30Row pattern recognition patch (planner).
671 - 7521a30Row pattern recognition patch (planner).
672 1950 if (opt->nodeType == RPR_PATTERN_ALT) 7521a30Row pattern recognition patch (planner).
673 10 newChildren = list_concat(newChildren, list_copy(opt->children)); 7521a30Row pattern recognition patch (planner).
674 - else 7521a30Row pattern recognition patch (planner).
675 1940 newChildren = lappend(newChildren, opt); 7521a30Row pattern recognition patch (planner).
676 - } 7521a30Row pattern recognition patch (planner).
677 - 7521a30Row pattern recognition patch (planner).
678 910 return newChildren; 7521a30Row pattern recognition patch (planner).
679 - } 7521a30Row pattern recognition patch (planner).
removeDuplicateAlternatives() lines 692-714
Modified Lines Coverage: 8/8 lines (100.0%)
LineHitsSourceCommit
692 910 removeDuplicateAlternatives(List *children) 7521a30Row pattern recognition patch (planner).
693 - { 7521a30Row pattern recognition patch (planner).
694 910 List *uniqueChildren = NIL; 7521a30Row pattern recognition patch (planner).
695 - 7521a30Row pattern recognition patch (planner).
696 2870 foreach_node(RPRPatternNode, child, children) 7521a30Row pattern recognition patch (planner).
697 - { 7521a30Row pattern recognition patch (planner).
698 - bool isDuplicate = false; 7521a30Row pattern recognition patch (planner).
699 - 7521a30Row pattern recognition patch (planner).
700 3160 foreach_node(RPRPatternNode, uchild, uniqueChildren) 7521a30Row pattern recognition patch (planner).
701 - { 7521a30Row pattern recognition patch (planner).
702 1220 if (rprPatternEqual(uchild, child)) 7521a30Row pattern recognition patch (planner).
703 - { 7521a30Row pattern recognition patch (planner).
704 - isDuplicate = true; 7521a30Row pattern recognition patch (planner).
705 - break; 7521a30Row pattern recognition patch (planner).
706 - } 7521a30Row pattern recognition patch (planner).
707 - } 7521a30Row pattern recognition patch (planner).
708 - 7521a30Row pattern recognition patch (planner).
709 1960 if (!isDuplicate) 7521a30Row pattern recognition patch (planner).
710 1940 uniqueChildren = lappend(uniqueChildren, child); 7521a30Row pattern recognition patch (planner).
711 - } 7521a30Row pattern recognition patch (planner).
712 - 7521a30Row pattern recognition patch (planner).
713 910 return uniqueChildren; 7521a30Row pattern recognition patch (planner).
714 - } 7521a30Row pattern recognition patch (planner).
optimizeAltPattern() lines 726-739
Modified Lines Coverage: 5/5 lines (100.0%)
LineHitsSourceCommit
726 910 optimizeAltPattern(RPRPatternNode *pattern) 7521a30Row pattern recognition patch (planner).
727 - { 7521a30Row pattern recognition patch (planner).
728 - /* Recursively optimize children and flatten nested ALT */ 7521a30Row pattern recognition patch (planner).
729 910 pattern->children = flattenAltChildren(pattern->children); 7521a30Row pattern recognition patch (planner).
730 - 7521a30Row pattern recognition patch (planner).
731 - /* Remove duplicate alternatives */ 7521a30Row pattern recognition patch (planner).
732 910 pattern->children = removeDuplicateAlternatives(pattern->children); 7521a30Row pattern recognition patch (planner).
733 - 7521a30Row pattern recognition patch (planner).
734 - /* Unwrap single-item ALT: ALT[A] -> A */ 7512d22Simplify row pattern compilation by passing the WindowClause
735 910 if (list_length(pattern->children) == 1) 7512d22Simplify row pattern compilation by passing the WindowClause
736 10 return (RPRPatternNode *) linitial(pattern->children); 7512d22Simplify row pattern compilation by passing the WindowClause
737 - 7512d22Simplify row pattern compilation by passing the WindowClause
738 - return pattern; 7512d22Simplify row pattern compilation by passing the WindowClause
739 - } 7521a30Row pattern recognition patch (planner).
tryMultiplyQuantifiers() lines 767-841
Modified Lines Coverage: 28/28 lines (100.0%)
LineHitsSourceCommit
767 4056 tryMultiplyQuantifiers(RPRPatternNode *pattern) 7521a30Row pattern recognition patch (planner).
768 - { 7521a30Row pattern recognition patch (planner).
769 4056 RPRPatternNode *child; 7521a30Row pattern recognition patch (planner).
770 4056 bool safe; 7521a30Row pattern recognition patch (planner).
771 4056 int64 new_min_64; 7521a30Row pattern recognition patch (planner).
772 4056 int64 new_max_64; 7521a30Row pattern recognition patch (planner).
773 - 7521a30Row pattern recognition patch (planner).
774 - /* Parser always creates GROUP with exactly one child */ 7521a30Row pattern recognition patch (planner).
775 4056 Assert(list_length(pattern->children) == 1); 7521a30Row pattern recognition patch (planner).
776 - 7521a30Row pattern recognition patch (planner).
777 4056 if (pattern->reluctant) 7521a30Row pattern recognition patch (planner).
778 - return pattern; 7521a30Row pattern recognition patch (planner).
779 - 7521a30Row pattern recognition patch (planner).
780 1680 child = (RPRPatternNode *) linitial(pattern->children); 7521a30Row pattern recognition patch (planner).
781 - 7521a30Row pattern recognition patch (planner).
782 1680 if ((child->nodeType != RPR_PATTERN_VAR && 7521a30Row pattern recognition patch (planner).
783 410 child->nodeType != RPR_PATTERN_GROUP) || 7521a30Row pattern recognition patch (planner).
784 410 child->reluctant) 7521a30Row pattern recognition patch (planner).
785 - return pattern; 7521a30Row pattern recognition patch (planner).
786 - 7521a30Row pattern recognition patch (planner).
787 - /* 7521a30Row pattern recognition patch (planner).
788 - * Decide whether the achievable counts form one contiguous interval. The 7521a30Row pattern recognition patch (planner).
789 - * child quantifier is {child->min, child->max} and the outer one is 7521a30Row pattern recognition patch (planner).
790 - * {pattern->min, pattern->max}; either max may be RPR_QUANTITY_INF. 7521a30Row pattern recognition patch (planner).
791 - */ 7521a30Row pattern recognition patch (planner).
792 380 if (pattern->min == pattern->max || child->min == 0) 7521a30Row pattern recognition patch (planner).
793 - safe = true; 7521a30Row pattern recognition patch (planner).
794 - else 7521a30Row pattern recognition patch (planner).
795 - { 7521a30Row pattern recognition patch (planner).
796 170 bool touch; 7521a30Row pattern recognition patch (planner).
797 170 bool zero_ok; 7521a30Row pattern recognition patch (planner).
798 - 7521a30Row pattern recognition patch (planner).
799 - /* 7521a30Row pattern recognition patch (planner).
800 - * Consecutive intervals [t*min, t*max] and [(t+1)*min, (t+1)*max] 7521a30Row pattern recognition patch (planner).
801 - * touch when (t+1)*min <= t*max + 1, i.e. min <= t*(max-min) + 1. 7521a30Row pattern recognition patch (planner).
802 - * This is tightest at the smallest t in play, Max(pattern->min, 1). 7521a30Row pattern recognition patch (planner).
803 - * An unbounded child->max makes every interval reach INF, so they 7521a30Row pattern recognition patch (planner).
804 - * always touch. 7521a30Row pattern recognition patch (planner).
805 - */ 7521a30Row pattern recognition patch (planner).
806 170 if (child->max == RPR_QUANTITY_INF) 7521a30Row pattern recognition patch (planner).
807 - touch = true; 7521a30Row pattern recognition patch (planner).
808 - else 7521a30Row pattern recognition patch (planner).
809 100 touch = ((int64) child->min <= 7521a30Row pattern recognition patch (planner).
810 100 (int64) Max(pattern->min, 1) * (child->max - child->min) + 1); 7521a30Row pattern recognition patch (planner).
811 - 7521a30Row pattern recognition patch (planner).
812 - /* 7521a30Row pattern recognition patch (planner).
813 - * A skippable outer (min 0) also needs {0} adjacent to the child 7521a30Row pattern recognition patch (planner).
814 - * range. 7521a30Row pattern recognition patch (planner).
815 - */ 7521a30Row pattern recognition patch (planner).
816 170 zero_ok = (pattern->min >= 1 || child->min <= 1); 7521a30Row pattern recognition patch (planner).
817 - 7521a30Row pattern recognition patch (planner).
818 145 safe = touch && zero_ok; 7521a30Row pattern recognition patch (planner).
819 - } 7521a30Row pattern recognition patch (planner).
820 - 7521a30Row pattern recognition patch (planner).
821 145 if (!safe) 7521a30Row pattern recognition patch (planner).
822 - return pattern; 7521a30Row pattern recognition patch (planner).
823 - 7521a30Row pattern recognition patch (planner).
824 - /* Flatten the child quantifier, guarding against overflow. */ 7521a30Row pattern recognition patch (planner).
825 305 new_min_64 = (int64) pattern->min * child->min; 7521a30Row pattern recognition patch (planner).
826 305 if (new_min_64 >= RPR_QUANTITY_INF) 7521a30Row pattern recognition patch (planner).
827 - return pattern; /* overflow, skip optimization */ 7521a30Row pattern recognition patch (planner).
828 - 7521a30Row pattern recognition patch (planner).
829 295 if (pattern->max == RPR_QUANTITY_INF || child->max == RPR_QUANTITY_INF) 7521a30Row pattern recognition patch (planner).
830 - new_max_64 = RPR_QUANTITY_INF; 7521a30Row pattern recognition patch (planner).
831 - else 7521a30Row pattern recognition patch (planner).
832 - { 7521a30Row pattern recognition patch (planner).
833 145 new_max_64 = (int64) pattern->max * child->max; 7521a30Row pattern recognition patch (planner).
834 145 if (new_max_64 >= RPR_QUANTITY_INF) 7521a30Row pattern recognition patch (planner).
835 - return pattern; 7521a30Row pattern recognition patch (planner).
836 - } 7521a30Row pattern recognition patch (planner).
837 - 7521a30Row pattern recognition patch (planner).
838 290 child->min = (int) new_min_64; 7521a30Row pattern recognition patch (planner).
839 290 child->max = (int) new_max_64; 7521a30Row pattern recognition patch (planner).
840 290 return child; 7521a30Row pattern recognition patch (planner).
841 - } 7521a30Row pattern recognition patch (planner).
tryUnwrapGroup() lines 861-888
Modified Lines Coverage: 11/11 lines (100.0%)
LineHitsSourceCommit
861 3766 tryUnwrapGroup(RPRPatternNode *pattern) 7521a30Row pattern recognition patch (planner).
862 - { 7521a30Row pattern recognition patch (planner).
863 3766 RPRPatternNode *child; 7521a30Row pattern recognition patch (planner).
864 - 7521a30Row pattern recognition patch (planner).
865 - /* Parser always creates GROUP with single child */ 7521a30Row pattern recognition patch (planner).
866 3766 Assert(list_length(pattern->children) == 1); 7521a30Row pattern recognition patch (planner).
867 - 7521a30Row pattern recognition patch (planner).
868 3766 child = (RPRPatternNode *) linitial(pattern->children); 7521a30Row pattern recognition patch (planner).
869 - 7521a30Row pattern recognition patch (planner).
870 - /* GROUP{1,1}: unwrap directly (reluctant on {1,1} is meaningless) */ 7521a30Row pattern recognition patch (planner).
871 3766 if (pattern->min == 1 && pattern->max == 1) 7521a30Row pattern recognition patch (planner).
872 - return child; 7521a30Row pattern recognition patch (planner).
873 - 7521a30Row pattern recognition patch (planner).
874 - /* 7521a30Row pattern recognition patch (planner).
875 - * Single VAR child with default {1,1}: propagate GROUP's quantifier to 7521a30Row pattern recognition patch (planner).
876 - * the child and unwrap. E.g., (A)?? -> A??, (A)+? -> A+? 7521a30Row pattern recognition patch (planner).
877 - */ 7521a30Row pattern recognition patch (planner).
878 3191 if (child->nodeType == RPR_PATTERN_VAR && 7521a30Row pattern recognition patch (planner).
879 119 child->min == 1 && child->max == 1 && child->reluctant == false) 7521a30Row pattern recognition patch (planner).
880 - { 7521a30Row pattern recognition patch (planner).
881 5 child->min = pattern->min; 7521a30Row pattern recognition patch (planner).
882 5 child->max = pattern->max; 7521a30Row pattern recognition patch (planner).
883 5 child->reluctant = pattern->reluctant; 7521a30Row pattern recognition patch (planner).
884 5 return child; 7521a30Row pattern recognition patch (planner).
885 - } 7521a30Row pattern recognition patch (planner).
886 - 7521a30Row pattern recognition patch (planner).
887 - return pattern; 7521a30Row pattern recognition patch (planner).
888 - } 7521a30Row pattern recognition patch (planner).
optimizeGroupPattern() lines 899-919
Modified Lines Coverage: 10/10 lines (100.0%)
LineHitsSourceCommit
899 4056 optimizeGroupPattern(RPRPatternNode *pattern) 7521a30Row pattern recognition patch (planner).
900 - { 7521a30Row pattern recognition patch (planner).
901 4056 List *newChildren; 7521a30Row pattern recognition patch (planner).
902 4056 RPRPatternNode *result; 7521a30Row pattern recognition patch (planner).
903 - 7521a30Row pattern recognition patch (planner).
904 - /* Recursively optimize children */ 7521a30Row pattern recognition patch (planner).
905 4056 newChildren = NIL; 7521a30Row pattern recognition patch (planner).
906 8112 foreach_node(RPRPatternNode, child, pattern->children) 7521a30Row pattern recognition patch (planner).
907 - { 7521a30Row pattern recognition patch (planner).
908 4056 newChildren = lappend(newChildren, optimizeRPRPattern(child)); 7521a30Row pattern recognition patch (planner).
909 - } 7521a30Row pattern recognition patch (planner).
910 4056 pattern->children = newChildren; 7521a30Row pattern recognition patch (planner).
911 - 7521a30Row pattern recognition patch (planner).
912 - /* Try quantifier multiplication */ 7521a30Row pattern recognition patch (planner).
913 4056 result = tryMultiplyQuantifiers(pattern); 7521a30Row pattern recognition patch (planner).
914 4056 if (result != pattern) 7521a30Row pattern recognition patch (planner).
915 - return result; 7521a30Row pattern recognition patch (planner).
916 - 7521a30Row pattern recognition patch (planner).
917 - /* Try unwrapping GROUP{1,1} */ 7521a30Row pattern recognition patch (planner).
918 3766 return tryUnwrapGroup(pattern); 7521a30Row pattern recognition patch (planner).
919 - } 7521a30Row pattern recognition patch (planner).
optimizeRPRPattern() lines 929-950
Modified Lines Coverage: 10/11 lines (90.9%)
LineHitsSourceCommit
929 312472 optimizeRPRPattern(RPRPatternNode *pattern) 7521a30Row pattern recognition patch (planner).
930 - { 7521a30Row pattern recognition patch (planner).
931 - /* Pattern nodes from parser are never NULL */ 7521a30Row pattern recognition patch (planner).
932 312472 Assert(pattern != NULL); 7521a30Row pattern recognition patch (planner).
933 - 7521a30Row pattern recognition patch (planner).
934 312472 check_stack_depth(); 7521a30Row pattern recognition patch (planner).
935 - 7521a30Row pattern recognition patch (planner).
936 312472 switch (pattern->nodeType) 7521a30Row pattern recognition patch (planner).
937 - { 7521a30Row pattern recognition patch (planner).
938 - case RPR_PATTERN_VAR: 7521a30Row pattern recognition patch (planner).
939 - return pattern; 7521a30Row pattern recognition patch (planner).
940 2769 case RPR_PATTERN_SEQ: 7521a30Row pattern recognition patch (planner).
941 2769 return optimizeSeqPattern(pattern); 7521a30Row pattern recognition patch (planner).
942 910 case RPR_PATTERN_ALT: 7521a30Row pattern recognition patch (planner).
943 910 return optimizeAltPattern(pattern); 7521a30Row pattern recognition patch (planner).
944 4056 case RPR_PATTERN_GROUP: 7521a30Row pattern recognition patch (planner).
945 4056 return optimizeGroupPattern(pattern); 7521a30Row pattern recognition patch (planner).
946 - } 7521a30Row pattern recognition patch (planner).
947 - 7521a30Row pattern recognition patch (planner).
948 0 pg_unreachable(); 7521a30Row pattern recognition patch (planner).
949 - return pattern; 7521a30Row pattern recognition patch (planner).
950 - } 7521a30Row pattern recognition patch (planner).
scanRPRPatternRecursive() lines 961-1047
Modified Lines Coverage: 30/30 lines (100.0%)
LineHitsSourceCommit
961 310692 scanRPRPatternRecursive(RPRPatternNode *node, char **varNames, int *numVars, 7521a30Row pattern recognition patch (planner).
962 - int *numElements, RPRDepth depth, RPRDepth *maxDepth) 7521a30Row pattern recognition patch (planner).
963 - { 7521a30Row pattern recognition patch (planner).
964 310692 int i; 7521a30Row pattern recognition patch (planner).
965 - 7521a30Row pattern recognition patch (planner).
966 - /* Pattern nodes from parser are never NULL */ 7521a30Row pattern recognition patch (planner).
967 310692 Assert(node != NULL); 7521a30Row pattern recognition patch (planner).
968 - 7521a30Row pattern recognition patch (planner).
969 310692 check_stack_depth(); 7521a30Row pattern recognition patch (planner).
970 - 7521a30Row pattern recognition patch (planner).
971 - /* Check recursion depth limit before overflow occurs */ 7521a30Row pattern recognition patch (planner).
972 310692 if (depth >= RPR_DEPTH_MAX) 7521a30Row pattern recognition patch (planner).
973 4 ereport(ERROR, 7521a30Row pattern recognition patch (planner).
974 - errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), 7521a30Row pattern recognition patch (planner).
975 - errmsg("pattern nesting too deep"), 7521a30Row pattern recognition patch (planner).
976 - errdetail("Pattern nesting depth %d exceeds maximum %d.", 7521a30Row pattern recognition patch (planner).
977 - depth, RPR_DEPTH_MAX - 1)); 7521a30Row pattern recognition patch (planner).
978 - 7521a30Row pattern recognition patch (planner).
979 - /* Track maximum depth */ 7521a30Row pattern recognition patch (planner).
980 310688 *maxDepth = Max(*maxDepth, depth); 7521a30Row pattern recognition patch (planner).
981 - 7521a30Row pattern recognition patch (planner).
982 310688 switch (node->nodeType) 7521a30Row pattern recognition patch (planner).
983 - { 7521a30Row pattern recognition patch (planner).
984 304148 case RPR_PATTERN_VAR: 7521a30Row pattern recognition patch (planner).
985 - /* Count element */ 7521a30Row pattern recognition patch (planner).
986 304148 (*numElements)++; 7521a30Row pattern recognition patch (planner).
987 - 7521a30Row pattern recognition patch (planner).
988 - /* Collect variable name if not already present */ 7521a30Row pattern recognition patch (planner).
989 602405 for (i = 0; i < *numVars; i++) 7521a30Row pattern recognition patch (planner).
990 - { 7521a30Row pattern recognition patch (planner).
991 602140 if (strcmp(varNames[i], node->varName) == 0) 7521a30Row pattern recognition patch (planner).
992 - return; /* Already have this variable */ 7521a30Row pattern recognition patch (planner).
993 - } 7521a30Row pattern recognition patch (planner).
994 - 7521a30Row pattern recognition patch (planner).
995 - /* 7521a30Row pattern recognition patch (planner).
996 - * Variable not in DEFINE clause - this is valid per ISO/IEC 7521a30Row pattern recognition patch (planner).
997 - * 19075-5 Feature R020. Such variables are implicitly TRUE. Add 7521a30Row pattern recognition patch (planner).
998 - * to varNames so they get a varId >= defineVariableList length, 7521a30Row pattern recognition patch (planner).
999 - * which executor treats as TRUE. 7521a30Row pattern recognition patch (planner).
1000 - */ 7521a30Row pattern recognition patch (planner).
1001 265 Assert(*numVars <= RPR_VARID_MAX); 7521a30Row pattern recognition patch (planner).
1002 265 varNames[(*numVars)++] = node->varName; 7521a30Row pattern recognition patch (planner).
1003 265 break; 7521a30Row pattern recognition patch (planner).
1004 - 7521a30Row pattern recognition patch (planner).
1005 - case RPR_PATTERN_SEQ: 7521a30Row pattern recognition patch (planner).
1006 - /* Sequence: just recurse into children */ 7521a30Row pattern recognition patch (planner).
1007 304562 foreach_node(RPRPatternNode, child, node->children) 7521a30Row pattern recognition patch (planner).
1008 - { 7521a30Row pattern recognition patch (planner).
1009 301998 scanRPRPatternRecursive(child, varNames, 7521a30Row pattern recognition patch (planner).
1010 - numVars, numElements, depth, maxDepth); 7521a30Row pattern recognition patch (planner).
1011 - } 7521a30Row pattern recognition patch (planner).
1012 - break; 7521a30Row pattern recognition patch (planner).
1013 - 7521a30Row pattern recognition patch (planner).
1014 3181 case RPR_PATTERN_GROUP: 7521a30Row pattern recognition patch (planner).
1015 - 7521a30Row pattern recognition patch (planner).
1016 - /* 7521a30Row pattern recognition patch (planner).
1017 - * Add BEGIN element if group has non-trivial quantifier (not 7521a30Row pattern recognition patch (planner).
1018 - * {1,1}) 7521a30Row pattern recognition patch (planner).
1019 - */ 7521a30Row pattern recognition patch (planner).
1020 3181 if (node->min != 1 || node->max != 1) 7521a30Row pattern recognition patch (planner).
1021 3181 (*numElements)++; 7521a30Row pattern recognition patch (planner).
1022 - 7521a30Row pattern recognition patch (planner).
1023 - /* Recurse into children at increased depth */ 7521a30Row pattern recognition patch (planner).
1024 5346 foreach_node(RPRPatternNode, child, node->children) 7521a30Row pattern recognition patch (planner).
1025 - { 7521a30Row pattern recognition patch (planner).
1026 3181 scanRPRPatternRecursive(child, varNames, 7521a30Row pattern recognition patch (planner).
1027 3181 numVars, numElements, depth + 1, maxDepth); 7521a30Row pattern recognition patch (planner).
1028 - } 7521a30Row pattern recognition patch (planner).
1029 - 7521a30Row pattern recognition patch (planner).
1030 - /* Add END element if group has non-trivial quantifier (not {1,1}) */ 7521a30Row pattern recognition patch (planner).
1031 2165 if (node->min != 1 || node->max != 1) 7521a30Row pattern recognition patch (planner).
1032 2165 (*numElements)++; 7521a30Row pattern recognition patch (planner).
1033 - break; 7521a30Row pattern recognition patch (planner).
1034 - 7521a30Row pattern recognition patch (planner).
1035 795 case RPR_PATTERN_ALT: 7521a30Row pattern recognition patch (planner).
1036 - /* Count ALT start element */ 7521a30Row pattern recognition patch (planner).
1037 795 (*numElements)++; 7521a30Row pattern recognition patch (planner).
1038 - 7521a30Row pattern recognition patch (planner).
1039 - /* Recurse into children at increased depth */ 7521a30Row pattern recognition patch (planner).
1040 2515 foreach_node(RPRPatternNode, child, node->children) 7521a30Row pattern recognition patch (planner).
1041 - { 7521a30Row pattern recognition patch (planner).
1042 1720 scanRPRPatternRecursive(child, varNames, 7521a30Row pattern recognition patch (planner).
1043 1720 numVars, numElements, depth + 1, maxDepth); 7521a30Row pattern recognition patch (planner).
1044 - } 7521a30Row pattern recognition patch (planner).
1045 - break; 7521a30Row pattern recognition patch (planner).
1046 - } 7521a30Row pattern recognition patch (planner).
1047 - } 7521a30Row pattern recognition patch (planner).
scanRPRPattern() lines 1058-1074
Modified Lines Coverage: 8/8 lines (100.0%)
LineHitsSourceCommit
1058 3793 scanRPRPattern(RPRPatternNode *node, char **varNames, int *numVars, 7521a30Row pattern recognition patch (planner).
1059 - int *numElements, RPRDepth *maxDepth) 7521a30Row pattern recognition patch (planner).
1060 - { 7521a30Row pattern recognition patch (planner).
1061 3793 *numElements = 0; 7521a30Row pattern recognition patch (planner).
1062 3793 *maxDepth = 0; 7521a30Row pattern recognition patch (planner).
1063 - 7521a30Row pattern recognition patch (planner).
1064 3793 scanRPRPatternRecursive(node, varNames, numVars, numElements, 0, maxDepth); 7521a30Row pattern recognition patch (planner).
1065 - 7521a30Row pattern recognition patch (planner).
1066 3789 (*numElements)++; /* +1 for FIN marker */ 7521a30Row pattern recognition patch (planner).
1067 - 7521a30Row pattern recognition patch (planner).
1068 3789 if (*numElements > RPR_ELEMIDX_MAX) 7521a30Row pattern recognition patch (planner).
1069 4 ereport(ERROR, 7521a30Row pattern recognition patch (planner).
1070 - errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), 7521a30Row pattern recognition patch (planner).
1071 - errmsg("pattern too complex"), 7521a30Row pattern recognition patch (planner).
1072 - errdetail("Pattern has %d elements, maximum is %d.", 7521a30Row pattern recognition patch (planner).
1073 - *numElements, RPR_ELEMIDX_MAX)); 7521a30Row pattern recognition patch (planner).
1074 3785 } 7521a30Row pattern recognition patch (planner).
makeRPRPattern() lines 1084-1109
Modified Lines Coverage: 15/15 lines (100.0%)
LineHitsSourceCommit
1084 3785 makeRPRPattern(int numVars, int numElements, RPRDepth maxDepth, 7521a30Row pattern recognition patch (planner).
1085 - char **varNamesStack) 7521a30Row pattern recognition patch (planner).
1086 - { 7521a30Row pattern recognition patch (planner).
1087 3785 RPRPattern *result; 7521a30Row pattern recognition patch (planner).
1088 3785 int i; 7521a30Row pattern recognition patch (planner).
1089 - 7521a30Row pattern recognition patch (planner).
1090 3785 result = makeNode(RPRPattern); 7521a30Row pattern recognition patch (planner).
1091 3785 result->numVars = numVars; 7521a30Row pattern recognition patch (planner).
1092 - 7521a30Row pattern recognition patch (planner).
1093 - /* depth < RPR_DEPTH_MAX, so maxDepth+1 never aliases RPR_DEPTH_NONE. */ 7521a30Row pattern recognition patch (planner).
1094 3785 Assert(maxDepth < RPR_DEPTH_MAX); 7521a30Row pattern recognition patch (planner).
1095 3785 result->maxDepth = maxDepth + 1; /* +1: depth is 0-based */ 7521a30Row pattern recognition patch (planner).
1096 3785 result->numElements = numElements; 7521a30Row pattern recognition patch (planner).
1097 - 7521a30Row pattern recognition patch (planner).
1098 - /* Copy varNames (pattern must have at least one variable) */ 7521a30Row pattern recognition patch (planner).
1099 3785 Assert(numVars > 0); 7521a30Row pattern recognition patch (planner).
1100 3785 result->varNames = palloc(numVars * sizeof(char *)); 7521a30Row pattern recognition patch (planner).
1101 12785 for (i = 0; i < numVars; i++) 7521a30Row pattern recognition patch (planner).
1102 9000 result->varNames[i] = pstrdup(varNamesStack[i]); 7521a30Row pattern recognition patch (planner).
1103 - 7521a30Row pattern recognition patch (planner).
1104 - /* Allocate elements array (zero-init for reserved fields) */ 7521a30Row pattern recognition patch (planner).
1105 3785 Assert(numElements >= 2); 7521a30Row pattern recognition patch (planner).
1106 3785 result->elements = palloc0(numElements * sizeof(RPRPatternElement)); 7521a30Row pattern recognition patch (planner).
1107 - 7521a30Row pattern recognition patch (planner).
1108 3785 return result; 7521a30Row pattern recognition patch (planner).
1109 - } 7521a30Row pattern recognition patch (planner).
getVarIdFromPattern() lines 1118-1129
Modified Lines Coverage: 4/5 lines (80.0%)
LineHitsSourceCommit
1118 173080 getVarIdFromPattern(RPRPattern *pat, const char *varName) 7521a30Row pattern recognition patch (planner).
1119 - { 7521a30Row pattern recognition patch (planner).
1120 405805 for (int i = 0; i < pat->numVars; i++) 7521a30Row pattern recognition patch (planner).
1121 - { 7521a30Row pattern recognition patch (planner).
1122 405805 if (strcmp(pat->varNames[i], varName) == 0) 7521a30Row pattern recognition patch (planner).
1123 173080 return (RPRVarId) i; 7521a30Row pattern recognition patch (planner).
1124 - } 7521a30Row pattern recognition patch (planner).
1125 - 7521a30Row pattern recognition patch (planner).
1126 - /* Should not happen - variable should already be collected */ 7521a30Row pattern recognition patch (planner).
1127 0 elog(ERROR, "pattern variable \"%s\" not found", varName); 7521a30Row pattern recognition patch (planner).
1128 - pg_unreachable(); 7521a30Row pattern recognition patch (planner).
1129 - } 7521a30Row pattern recognition patch (planner).
fillRPRPatternVar() lines 1138-1156
Modified Lines Coverage: 14/14 lines (100.0%)
LineHitsSourceCommit
1138 173080 fillRPRPatternVar(RPRPatternNode *node, RPRPattern *pat, int *idx, RPRDepth depth) 7521a30Row pattern recognition patch (planner).
1139 - { 7521a30Row pattern recognition patch (planner).
1140 173080 RPRPatternElement *elem = &pat->elements[*idx]; 7521a30Row pattern recognition patch (planner).
1141 - 7521a30Row pattern recognition patch (planner).
1142 173080 memset(elem, 0, sizeof(RPRPatternElement)); 7521a30Row pattern recognition patch (planner).
1143 173080 elem->varId = getVarIdFromPattern(pat, node->varName); 7521a30Row pattern recognition patch (planner).
1144 173080 elem->depth = depth; 7521a30Row pattern recognition patch (planner).
1145 173080 elem->min = node->min; 7521a30Row pattern recognition patch (planner).
1146 173080 elem->max = node->max; ff2558eTidy up the row pattern unbounded-quantifier sentinel
1147 173080 Assert(elem->min >= 0 && elem->min < RPR_QUANTITY_INF && 7521a30Row pattern recognition patch (planner).
1148 - elem->max >= 1 && elem->min <= elem->max); ff2558eTidy up the row pattern unbounded-quantifier sentinel
1149 173080 elem->next = RPR_ELEMIDX_INVALID; 7521a30Row pattern recognition patch (planner).
1150 173080 elem->jump = RPR_ELEMIDX_INVALID; 7521a30Row pattern recognition patch (planner).
1151 173080 if (node->reluctant) 7521a30Row pattern recognition patch (planner).
1152 245 elem->flags |= RPR_ELEM_RELUCTANT; 7521a30Row pattern recognition patch (planner).
1153 173080 (*idx)++; 7521a30Row pattern recognition patch (planner).
1154 - 7521a30Row pattern recognition patch (planner).
1155 173080 return (node->min == 0); 7521a30Row pattern recognition patch (planner).
1156 - } 7521a30Row pattern recognition patch (planner).
fillRPRPatternGroup() lines 1181-1247
Modified Lines Coverage: 40/40 lines (100.0%)
LineHitsSourceCommit
1181 2165 fillRPRPatternGroup(RPRPatternNode *node, RPRPattern *pat, int *idx, RPRDepth depth) 7521a30Row pattern recognition patch (planner).
1182 - { 7521a30Row pattern recognition patch (planner).
1183 2165 int groupStartIdx = *idx; 7521a30Row pattern recognition patch (planner).
1184 2165 int beginIdx = -1; 7521a30Row pattern recognition patch (planner).
1185 2165 bool bodyNullable = true; 7521a30Row pattern recognition patch (planner).
1186 - 7521a30Row pattern recognition patch (planner).
1187 - /* Add BEGIN marker if group has non-trivial quantifier (not {1,1}) */ 7521a30Row pattern recognition patch (planner).
1188 2165 if (node->min != 1 || node->max != 1) 7521a30Row pattern recognition patch (planner).
1189 - { 7521a30Row pattern recognition patch (planner).
1190 2165 RPRPatternElement *elem = &pat->elements[*idx]; 7521a30Row pattern recognition patch (planner).
1191 - 7521a30Row pattern recognition patch (planner).
1192 2165 beginIdx = *idx; 7521a30Row pattern recognition patch (planner).
1193 2165 memset(elem, 0, sizeof(RPRPatternElement)); 7521a30Row pattern recognition patch (planner).
1194 2165 elem->varId = RPR_VARID_BEGIN; 7521a30Row pattern recognition patch (planner).
1195 2165 elem->depth = depth; 7521a30Row pattern recognition patch (planner).
1196 2165 elem->min = node->min; 7521a30Row pattern recognition patch (planner).
1197 2165 elem->max = node->max; ff2558eTidy up the row pattern unbounded-quantifier sentinel
1198 2165 Assert(elem->min >= 0 && elem->min < RPR_QUANTITY_INF && 7521a30Row pattern recognition patch (planner).
1199 - elem->max >= 1 && elem->min <= elem->max); ff2558eTidy up the row pattern unbounded-quantifier sentinel
1200 2165 elem->next = RPR_ELEMIDX_INVALID; /* set by finalize */ 7521a30Row pattern recognition patch (planner).
1201 2165 elem->jump = RPR_ELEMIDX_INVALID; /* set after END */ 7521a30Row pattern recognition patch (planner).
1202 2165 if (node->reluctant) 7521a30Row pattern recognition patch (planner).
1203 1355 elem->flags |= RPR_ELEM_RELUCTANT; 7521a30Row pattern recognition patch (planner).
1204 2165 (*idx)++; 7521a30Row pattern recognition patch (planner).
1205 2165 groupStartIdx = *idx; /* children start after BEGIN */ 7521a30Row pattern recognition patch (planner).
1206 - } 7521a30Row pattern recognition patch (planner).
1207 - 7521a30Row pattern recognition patch (planner).
1208 4330 foreach_node(RPRPatternNode, child, node->children) 7521a30Row pattern recognition patch (planner).
1209 - { 7521a30Row pattern recognition patch (planner).
1210 2165 if (!fillRPRPattern(child, pat, idx, depth + 1)) 7521a30Row pattern recognition patch (planner).
1211 2080 bodyNullable = false; 7521a30Row pattern recognition patch (planner).
1212 - } 7521a30Row pattern recognition patch (planner).
1213 - 7521a30Row pattern recognition patch (planner).
1214 - /* Add group end marker if group has non-trivial quantifier (not {1,1}) */ 7521a30Row pattern recognition patch (planner).
1215 2165 if (node->min != 1 || node->max != 1) 7521a30Row pattern recognition patch (planner).
1216 - { 7521a30Row pattern recognition patch (planner).
1217 2165 RPRPatternElement *beginElem = &pat->elements[beginIdx]; 7521a30Row pattern recognition patch (planner).
1218 2165 RPRPatternElement *endElem = &pat->elements[*idx]; 7521a30Row pattern recognition patch (planner).
1219 - 7521a30Row pattern recognition patch (planner).
1220 2165 memset(endElem, 0, sizeof(RPRPatternElement)); 7521a30Row pattern recognition patch (planner).
1221 2165 endElem->varId = RPR_VARID_END; 7521a30Row pattern recognition patch (planner).
1222 2165 endElem->depth = depth; 7521a30Row pattern recognition patch (planner).
1223 2165 endElem->min = node->min; 7521a30Row pattern recognition patch (planner).
1224 2165 endElem->max = node->max; ff2558eTidy up the row pattern unbounded-quantifier sentinel
1225 2165 Assert(endElem->min >= 0 && endElem->min < RPR_QUANTITY_INF && 7521a30Row pattern recognition patch (planner).
1226 - endElem->max >= 1 && endElem->min <= endElem->max); ff2558eTidy up the row pattern unbounded-quantifier sentinel
1227 2165 endElem->next = RPR_ELEMIDX_INVALID; 7521a30Row pattern recognition patch (planner).
1228 2165 endElem->jump = groupStartIdx; /* loop to first child */ 7521a30Row pattern recognition patch (planner).
1229 2165 if (node->reluctant) 7521a30Row pattern recognition patch (planner).
1230 1355 endElem->flags |= RPR_ELEM_RELUCTANT; 7521a30Row pattern recognition patch (planner).
1231 - 7521a30Row pattern recognition patch (planner).
1232 - /* 7521a30Row pattern recognition patch (planner).
1233 - * If the group body is nullable, mark the END element so that ff2558eTidy up the row pattern unbounded-quantifier sentinel
1234 - * nfa_advance_end can fast-forward the iteration count to min when ff2558eTidy up the row pattern unbounded-quantifier sentinel
1235 - * reached via empty-match skip paths. ff2558eTidy up the row pattern unbounded-quantifier sentinel
1236 - */ 7521a30Row pattern recognition patch (planner).
1237 2165 if (bodyNullable) 7521a30Row pattern recognition patch (planner).
1238 85 endElem->flags |= RPR_ELEM_EMPTY_LOOP; 7521a30Row pattern recognition patch (planner).
1239 - 7521a30Row pattern recognition patch (planner).
1240 2165 (*idx)++; 7521a30Row pattern recognition patch (planner).
1241 - 7521a30Row pattern recognition patch (planner).
1242 - /* Set BEGIN skip pointer (next is set by finalize) */ 7521a30Row pattern recognition patch (planner).
1243 2165 beginElem->jump = *idx; /* skip: go to after END */ 7521a30Row pattern recognition patch (planner).
1244 - } 7521a30Row pattern recognition patch (planner).
1245 - 7521a30Row pattern recognition patch (planner).
1246 2165 return (node->min == 0 || bodyNullable); 7521a30Row pattern recognition patch (planner).
1247 - } 7521a30Row pattern recognition patch (planner).
fillRPRPatternAlt() lines 1260-1335
Modified Lines Coverage: 39/39 lines (100.0%)
LineHitsSourceCommit
1260 795 fillRPRPatternAlt(RPRPatternNode *node, RPRPattern *pat, int *idx, RPRDepth depth) 7521a30Row pattern recognition patch (planner).
1261 - { 7521a30Row pattern recognition patch (planner).
1262 795 ListCell *lc; 7521a30Row pattern recognition patch (planner).
1263 795 ListCell *lc2; 7521a30Row pattern recognition patch (planner).
1264 795 RPRPatternElement *elem; 7521a30Row pattern recognition patch (planner).
1265 795 List *altBranchStarts = NIL; 7521a30Row pattern recognition patch (planner).
1266 795 List *altEndPositions = NIL; 7521a30Row pattern recognition patch (planner).
1267 795 int afterAltIdx; 7521a30Row pattern recognition patch (planner).
1268 795 bool anyNullable = false; 7521a30Row pattern recognition patch (planner).
1269 - 7521a30Row pattern recognition patch (planner).
1270 - /* Add alternation start marker */ 7521a30Row pattern recognition patch (planner).
1271 795 elem = &pat->elements[*idx]; 7521a30Row pattern recognition patch (planner).
1272 795 memset(elem, 0, sizeof(RPRPatternElement)); 7521a30Row pattern recognition patch (planner).
1273 795 elem->varId = RPR_VARID_ALT; 7521a30Row pattern recognition patch (planner).
1274 795 elem->depth = depth; 7521a30Row pattern recognition patch (planner).
1275 795 elem->min = 1; 7521a30Row pattern recognition patch (planner).
1276 795 elem->max = 1; 7521a30Row pattern recognition patch (planner).
1277 795 elem->next = RPR_ELEMIDX_INVALID; 7521a30Row pattern recognition patch (planner).
1278 795 elem->jump = RPR_ELEMIDX_INVALID; 7521a30Row pattern recognition patch (planner).
1279 795 (*idx)++; 7521a30Row pattern recognition patch (planner).
1280 - 7521a30Row pattern recognition patch (planner).
1281 - /* Fill each alternative */ 7521a30Row pattern recognition patch (planner).
1282 2515 foreach_node(RPRPatternNode, alt, node->children) 7521a30Row pattern recognition patch (planner).
1283 - { 7521a30Row pattern recognition patch (planner).
1284 1720 int branchStart = *idx; 7521a30Row pattern recognition patch (planner).
1285 - 7521a30Row pattern recognition patch (planner).
1286 1720 altBranchStarts = lappend_int(altBranchStarts, branchStart); 7521a30Row pattern recognition patch (planner).
1287 1720 if (fillRPRPattern(alt, pat, idx, depth + 1)) 7521a30Row pattern recognition patch (planner).
1288 35 anyNullable = true; 7521a30Row pattern recognition patch (planner).
1289 1720 altEndPositions = lappend_int(altEndPositions, *idx - 1); 7521a30Row pattern recognition patch (planner).
1290 - } 7521a30Row pattern recognition patch (planner).
1291 - 7521a30Row pattern recognition patch (planner).
1292 - /* Set jump on first element of each alternative to next alternative */ 7521a30Row pattern recognition patch (planner).
1293 2515 foreach(lc, altBranchStarts) 7521a30Row pattern recognition patch (planner).
1294 - { 7521a30Row pattern recognition patch (planner).
1295 1720 int firstElemIdx = lfirst_int(lc); 7521a30Row pattern recognition patch (planner).
1296 - 7521a30Row pattern recognition patch (planner).
1297 1720 if (lnext(altBranchStarts, lc) != NULL) 7521a30Row pattern recognition patch (planner).
1298 925 pat->elements[firstElemIdx].jump = lfirst_int(lnext(altBranchStarts, lc)); 7521a30Row pattern recognition patch (planner).
1299 - } 7521a30Row pattern recognition patch (planner).
1300 - 7521a30Row pattern recognition patch (planner).
1301 - /* Set next on last element of each alternative to after the alternation */ 7521a30Row pattern recognition patch (planner).
1302 795 afterAltIdx = *idx; 7521a30Row pattern recognition patch (planner).
1303 - 7521a30Row pattern recognition patch (planner).
1304 2515 forboth(lc, altEndPositions, lc2, altBranchStarts) 7521a30Row pattern recognition patch (planner).
1305 - { 7521a30Row pattern recognition patch (planner).
1306 1720 int endPos = lfirst_int(lc); 7521a30Row pattern recognition patch (planner).
1307 1720 int branchStart = lfirst_int(lc2); 7521a30Row pattern recognition patch (planner).
1308 - 7521a30Row pattern recognition patch (planner).
1309 1720 if (pat->elements[endPos].next != RPR_ELEMIDX_INVALID) 7521a30Row pattern recognition patch (planner).
1310 - { 7521a30Row pattern recognition patch (planner).
1311 - /* 7521a30Row pattern recognition patch (planner).
1312 - * An inner ALT already set next on this element. Redirect all 7521a30Row pattern recognition patch (planner).
1313 - * elements in this branch that share the same target to point to 7521a30Row pattern recognition patch (planner).
1314 - * after this ALT instead. 7521a30Row pattern recognition patch (planner).
1315 - */ 7521a30Row pattern recognition patch (planner).
1316 - int oldTarget = pat->elements[endPos].next; 7521a30Row pattern recognition patch (planner).
1317 - int j; 7521a30Row pattern recognition patch (planner).
1318 - 7521a30Row pattern recognition patch (planner).
1319 425 for (j = branchStart; j <= endPos; j++) 7521a30Row pattern recognition patch (planner).
1320 - { 7521a30Row pattern recognition patch (planner).
1321 365 if (pat->elements[j].next == oldTarget) 7521a30Row pattern recognition patch (planner).
1322 160 pat->elements[j].next = afterAltIdx; 7521a30Row pattern recognition patch (planner).
1323 - } 7521a30Row pattern recognition patch (planner).
1324 - } 7521a30Row pattern recognition patch (planner).
1325 - else 7521a30Row pattern recognition patch (planner).
1326 - { 7521a30Row pattern recognition patch (planner).
1327 1660 pat->elements[endPos].next = afterAltIdx; 7521a30Row pattern recognition patch (planner).
1328 - } 7521a30Row pattern recognition patch (planner).
1329 - } 7521a30Row pattern recognition patch (planner).
1330 - 7521a30Row pattern recognition patch (planner).
1331 795 list_free(altBranchStarts); 7521a30Row pattern recognition patch (planner).
1332 795 list_free(altEndPositions); 7521a30Row pattern recognition patch (planner).
1333 - 7521a30Row pattern recognition patch (planner).
1334 795 return anyNullable; 7521a30Row pattern recognition patch (planner).
1335 - } 7521a30Row pattern recognition patch (planner).
fillRPRPattern() lines 1349-1380
Modified Lines Coverage: 14/15 lines (93.3%)
LineHitsSourceCommit
1349 178600 fillRPRPattern(RPRPatternNode *node, RPRPattern *pat, int *idx, RPRDepth depth) 7521a30Row pattern recognition patch (planner).
1350 - { 7521a30Row pattern recognition patch (planner).
1351 178600 bool allNullable = true; 7521a30Row pattern recognition patch (planner).
1352 - 7521a30Row pattern recognition patch (planner).
1353 - /* Pattern nodes from parser are never NULL */ 7521a30Row pattern recognition patch (planner).
1354 178600 Assert(node != NULL); 7521a30Row pattern recognition patch (planner).
1355 - 7521a30Row pattern recognition patch (planner).
1356 178600 check_stack_depth(); 7521a30Row pattern recognition patch (planner).
1357 - 7521a30Row pattern recognition patch (planner).
1358 178600 switch (node->nodeType) 7521a30Row pattern recognition patch (planner).
1359 - { 7521a30Row pattern recognition patch (planner).
1360 - case RPR_PATTERN_SEQ: 7521a30Row pattern recognition patch (planner).
1361 173490 foreach_node(RPRPatternNode, child, node->children) 7521a30Row pattern recognition patch (planner).
1362 - { 7521a30Row pattern recognition patch (planner).
1363 170930 if (!fillRPRPattern(child, pat, idx, depth)) 7521a30Row pattern recognition patch (planner).
1364 170690 allNullable = false; 7521a30Row pattern recognition patch (planner).
1365 - } 7521a30Row pattern recognition patch (planner).
1366 - return allNullable; 7521a30Row pattern recognition patch (planner).
1367 - 7521a30Row pattern recognition patch (planner).
1368 173080 case RPR_PATTERN_VAR: 7521a30Row pattern recognition patch (planner).
1369 173080 return fillRPRPatternVar(node, pat, idx, depth); 7521a30Row pattern recognition patch (planner).
1370 - 7521a30Row pattern recognition patch (planner).
1371 2165 case RPR_PATTERN_GROUP: 7521a30Row pattern recognition patch (planner).
1372 2165 return fillRPRPatternGroup(node, pat, idx, depth); 7521a30Row pattern recognition patch (planner).
1373 - 7521a30Row pattern recognition patch (planner).
1374 795 case RPR_PATTERN_ALT: 7521a30Row pattern recognition patch (planner).
1375 795 return fillRPRPatternAlt(node, pat, idx, depth); 7521a30Row pattern recognition patch (planner).
1376 - } 7521a30Row pattern recognition patch (planner).
1377 - 7521a30Row pattern recognition patch (planner).
1378 0 pg_unreachable(); 7521a30Row pattern recognition patch (planner).
1379 - return false; 7521a30Row pattern recognition patch (planner).
1380 - } 7521a30Row pattern recognition patch (planner).
finalizeRPRPattern() lines 1392-1423
Modified Lines Coverage: 19/19 lines (100.0%)
LineHitsSourceCommit
1392 3785 finalizeRPRPattern(RPRPattern *result) 7521a30Row pattern recognition patch (planner).
1393 - { 7521a30Row pattern recognition patch (planner).
1394 3785 int finIdx = result->numElements - 1; 7521a30Row pattern recognition patch (planner).
1395 3785 int i; 7521a30Row pattern recognition patch (planner).
1396 3785 RPRPatternElement *finElem; 7521a30Row pattern recognition patch (planner).
1397 - 7521a30Row pattern recognition patch (planner).
1398 - /* Initialize absorption flag */ 7521a30Row pattern recognition patch (planner).
1399 3785 result->isAbsorbable = false; 7521a30Row pattern recognition patch (planner).
1400 - 7521a30Row pattern recognition patch (planner).
1401 - /* Set up next pointers for elements that don't have one */ 7521a30Row pattern recognition patch (planner).
1402 181990 for (i = 0; i < finIdx; i++) 7521a30Row pattern recognition patch (planner).
1403 - { 7521a30Row pattern recognition patch (planner).
1404 178205 RPRPatternElement *elem = &result->elements[i]; 7521a30Row pattern recognition patch (planner).
1405 - 7521a30Row pattern recognition patch (planner).
1406 178205 if (elem->next == RPR_ELEMIDX_INVALID) 7521a30Row pattern recognition patch (planner).
1407 176545 elem->next = (i < finIdx - 1) ? i + 1 : finIdx; 7521a30Row pattern recognition patch (planner).
1408 - 7521a30Row pattern recognition patch (planner).
1409 - /* Verify quantifier range is valid */ 7521a30Row pattern recognition patch (planner).
1410 178205 Assert(elem->min >= 0 && elem->min < RPR_QUANTITY_INF && 7521a30Row pattern recognition patch (planner).
1411 - elem->max >= 1 && elem->min <= elem->max); ff2558eTidy up the row pattern unbounded-quantifier sentinel
1412 - } 7521a30Row pattern recognition patch (planner).
1413 - 7521a30Row pattern recognition patch (planner).
1414 - /* Add FIN marker at the end */ 7521a30Row pattern recognition patch (planner).
1415 3785 finElem = &result->elements[finIdx]; 7521a30Row pattern recognition patch (planner).
1416 3785 memset(finElem, 0, sizeof(RPRPatternElement)); 7521a30Row pattern recognition patch (planner).
1417 3785 finElem->varId = RPR_VARID_FIN; 7521a30Row pattern recognition patch (planner).
1418 3785 finElem->depth = 0; 7521a30Row pattern recognition patch (planner).
1419 3785 finElem->min = 1; 7521a30Row pattern recognition patch (planner).
1420 3785 finElem->max = 1; 7521a30Row pattern recognition patch (planner).
1421 3785 finElem->next = RPR_ELEMIDX_INVALID; 7521a30Row pattern recognition patch (planner).
1422 3785 finElem->jump = RPR_ELEMIDX_INVALID; 7521a30Row pattern recognition patch (planner).
1423 3785 } 7521a30Row pattern recognition patch (planner).
isFixedLengthChildren() lines 1526-1568
Modified Lines Coverage: 16/16 lines (100.0%)
LineHitsSourceCommit
1526 163510 isFixedLengthChildren(RPRPattern *pattern, RPRElemIdx idx, RPRDepth scopeDepth) 7521a30Row pattern recognition patch (planner).
1527 - { 7521a30Row pattern recognition patch (planner).
1528 163510 RPRPatternElement *e = &pattern->elements[idx]; 7521a30Row pattern recognition patch (planner).
1529 - 7521a30Row pattern recognition patch (planner).
1530 163510 check_stack_depth(); 7521a30Row pattern recognition patch (planner).
1531 - 7521a30Row pattern recognition patch (planner).
1532 331900 while (e->depth == scopeDepth) 7521a30Row pattern recognition patch (planner).
1533 - { 7521a30Row pattern recognition patch (planner).
1534 330550 if (RPRElemIsVar(e)) 7521a30Row pattern recognition patch (planner).
1535 - { 7521a30Row pattern recognition patch (planner).
1536 170465 if (e->min != e->max) 7521a30Row pattern recognition patch (planner).
1537 - return false; 7521a30Row pattern recognition patch (planner).
1538 - } 7521a30Row pattern recognition patch (planner).
1539 160085 else if (RPRElemIsBegin(e)) 7521a30Row pattern recognition patch (planner).
1540 - { 7521a30Row pattern recognition patch (planner).
1541 159555 RPRElemIdx childIdx = e->next; 7521a30Row pattern recognition patch (planner).
1542 - 7521a30Row pattern recognition patch (planner).
1543 - /* Recurse into subgroup children at scopeDepth + 1 */ 7521a30Row pattern recognition patch (planner).
1544 159555 if (!isFixedLengthChildren(pattern, childIdx, scopeDepth + 1)) 7521a30Row pattern recognition patch (planner).
1545 - return false; 7521a30Row pattern recognition patch (planner).
1546 - 7521a30Row pattern recognition patch (planner).
1547 - /* Advance past the subgroup to its END element */ 7521a30Row pattern recognition patch (planner).
1548 130 e = &pattern->elements[e->next]; 7521a30Row pattern recognition patch (planner).
1549 445 while (e->depth > scopeDepth) 7521a30Row pattern recognition patch (planner).
1550 315 e = &pattern->elements[e->next]; 7521a30Row pattern recognition patch (planner).
1551 - 7521a30Row pattern recognition patch (planner).
1552 - /* e is now the END at scopeDepth; check its quantifier */ 7521a30Row pattern recognition patch (planner).
1553 130 Assert(RPRElemIsEnd(e) && e->depth == scopeDepth); 7521a30Row pattern recognition patch (planner).
1554 130 if (e->min != e->max) 7521a30Row pattern recognition patch (planner).
1555 - return false; 7521a30Row pattern recognition patch (planner).
1556 - } 7521a30Row pattern recognition patch (planner).
1557 - else 7521a30Row pattern recognition patch (planner).
1558 - { 7521a30Row pattern recognition patch (planner).
1559 - /* ALT inside group: not supported for absorption */ 7521a30Row pattern recognition patch (planner).
1560 - return false; 7521a30Row pattern recognition patch (planner).
1561 - } 7521a30Row pattern recognition patch (planner).
1562 - 7521a30Row pattern recognition patch (planner).
1563 168390 Assert(e->next != RPR_ELEMIDX_INVALID); 7521a30Row pattern recognition patch (planner).
1564 168390 e = &pattern->elements[e->next]; 7521a30Row pattern recognition patch (planner).
1565 - } 7521a30Row pattern recognition patch (planner).
1566 - 7521a30Row pattern recognition patch (planner).
1567 - return true; 7521a30Row pattern recognition patch (planner).
1568 - } 7521a30Row pattern recognition patch (planner).
isUnboundedStart() lines 1600-1644
Modified Lines Coverage: 21/21 lines (100.0%)
LineHitsSourceCommit
1600 5155 isUnboundedStart(RPRPattern *pattern, RPRElemIdx idx) 7521a30Row pattern recognition patch (planner).
1601 - { 7521a30Row pattern recognition patch (planner).
1602 5155 RPRPatternElement *elem = &pattern->elements[idx]; 7521a30Row pattern recognition patch (planner).
1603 5155 RPRDepth startDepth = elem->depth; 7521a30Row pattern recognition patch (planner).
1604 5155 RPRPatternElement *e; 7521a30Row pattern recognition patch (planner).
1605 - 7521a30Row pattern recognition patch (planner).
1606 - /* Case 1: Simple unbounded VAR at start (greedy only) */ 7521a30Row pattern recognition patch (planner).
1607 5155 if (RPRElemIsVar(elem) && elem->max == RPR_QUANTITY_INF && 7521a30Row pattern recognition patch (planner).
1608 1280 !RPRElemIsReluctant(elem)) 7521a30Row pattern recognition patch (planner).
1609 - { 7521a30Row pattern recognition patch (planner).
1610 - /* Set both flags on first element */ 7521a30Row pattern recognition patch (planner).
1611 1200 elem->flags |= RPR_ELEM_ABSORBABLE_BRANCH | RPR_ELEM_ABSORBABLE; 7521a30Row pattern recognition patch (planner).
1612 1200 return true; 7521a30Row pattern recognition patch (planner).
1613 - } 7521a30Row pattern recognition patch (planner).
1614 - 7521a30Row pattern recognition patch (planner).
1615 - /* 7521a30Row pattern recognition patch (planner).
1616 - * Case 2: Unbounded GROUP with fixed-length children. Each child must 7521a30Row pattern recognition patch (planner).
1617 - * have min == max (recursively for nested subgroups), ensuring a fixed 7521a30Row pattern recognition patch (planner).
1618 - * step size per iteration so that count-dominance holds. 7521a30Row pattern recognition patch (planner).
1619 - */ 7521a30Row pattern recognition patch (planner).
1620 3955 if (!isFixedLengthChildren(pattern, idx, startDepth)) 7521a30Row pattern recognition patch (planner).
1621 - return false; 7521a30Row pattern recognition patch (planner).
1622 - 7521a30Row pattern recognition patch (planner).
1623 - /* Find the END element at startDepth - 1 */ 7521a30Row pattern recognition patch (planner).
1624 1220 e = &pattern->elements[idx]; 7521a30Row pattern recognition patch (planner).
1625 3180 while (e->depth >= startDepth) 7521a30Row pattern recognition patch (planner).
1626 1960 e = &pattern->elements[e->next]; 7521a30Row pattern recognition patch (planner).
1627 - 7521a30Row pattern recognition patch (planner).
1628 - /* END must be unbounded greedy */ 7521a30Row pattern recognition patch (planner).
1629 1220 if (e->depth == startDepth - 1 && 7521a30Row pattern recognition patch (planner).
1630 915 RPRElemIsEnd(e) && e->max == RPR_QUANTITY_INF && 7521a30Row pattern recognition patch (planner).
1631 280 !RPRElemIsReluctant(e)) 7521a30Row pattern recognition patch (planner).
1632 - { 7521a30Row pattern recognition patch (planner).
1633 250 Assert(e->jump == idx); /* END points back to first child */ 7521a30Row pattern recognition patch (planner).
1634 - 7521a30Row pattern recognition patch (planner).
1635 - /* Set ABSORBABLE_BRANCH on all children, ABSORBABLE on END only */ 7521a30Row pattern recognition patch (planner).
1636 955 for (e = elem; !RPRElemIsEnd(e) || e->depth >= startDepth; 7521a30Row pattern recognition patch (planner).
1637 705 e = &pattern->elements[e->next]) 7521a30Row pattern recognition patch (planner).
1638 705 e->flags |= RPR_ELEM_ABSORBABLE_BRANCH; 7521a30Row pattern recognition patch (planner).
1639 250 e->flags |= RPR_ELEM_ABSORBABLE_BRANCH | RPR_ELEM_ABSORBABLE; 7521a30Row pattern recognition patch (planner).
1640 250 return true; 7521a30Row pattern recognition patch (planner).
1641 - } 7521a30Row pattern recognition patch (planner).
1642 - 7521a30Row pattern recognition patch (planner).
1643 - return false; 7521a30Row pattern recognition patch (planner).
1644 - } 7521a30Row pattern recognition patch (planner).
computeAbsorbabilityRecursive() lines 1660-1732
Modified Lines Coverage: 29/29 lines (100.0%)
LineHitsSourceCommit
1660 5665 computeAbsorbabilityRecursive(RPRPattern *pattern, RPRElemIdx startIdx, 7521a30Row pattern recognition patch (planner).
1661 - bool *hasAbsorbable) 7521a30Row pattern recognition patch (planner).
1662 - { 7521a30Row pattern recognition patch (planner).
1663 5665 RPRPatternElement *elem = &pattern->elements[startIdx]; 7521a30Row pattern recognition patch (planner).
1664 - 7521a30Row pattern recognition patch (planner).
1665 5665 check_stack_depth(); 7521a30Row pattern recognition patch (planner).
1666 - 7521a30Row pattern recognition patch (planner).
1667 5665 if (RPRElemIsAlt(elem)) 7521a30Row pattern recognition patch (planner).
1668 - { 7521a30Row pattern recognition patch (planner).
1669 - /* ALT: recursively check each branch */ 7521a30Row pattern recognition patch (planner).
1670 510 RPRElemIdx branchIdx = elem->next; 7521a30Row pattern recognition patch (planner).
1671 510 RPRPatternElement *branchFirst; 7521a30Row pattern recognition patch (planner).
1672 510 bool branchAbsorbable; 7521a30Row pattern recognition patch (planner).
1673 - 7521a30Row pattern recognition patch (planner).
1674 1630 while (branchIdx != RPR_ELEMIDX_INVALID) 7521a30Row pattern recognition patch (planner).
1675 - { 7521a30Row pattern recognition patch (planner).
1676 1145 branchAbsorbable = false; 7521a30Row pattern recognition patch (planner).
1677 - 7521a30Row pattern recognition patch (planner).
1678 1145 Assert(branchIdx < pattern->numElements); 7521a30Row pattern recognition patch (planner).
1679 1145 branchFirst = &pattern->elements[branchIdx]; 7521a30Row pattern recognition patch (planner).
1680 - 7521a30Row pattern recognition patch (planner).
1681 - /* Stop if element is outside ALT scope (not a branch) */ 7521a30Row pattern recognition patch (planner).
1682 1145 if (branchFirst->depth <= elem->depth) 7521a30Row pattern recognition patch (planner).
1683 - break; 7521a30Row pattern recognition patch (planner).
1684 - 7521a30Row pattern recognition patch (planner).
1685 - /* Recursively check this branch */ 7521a30Row pattern recognition patch (planner).
1686 1120 computeAbsorbabilityRecursive(pattern, branchIdx, &branchAbsorbable); 7521a30Row pattern recognition patch (planner).
1687 1120 if (branchAbsorbable) 7521a30Row pattern recognition patch (planner).
1688 - { 7521a30Row pattern recognition patch (planner).
1689 220 *hasAbsorbable = true; 7521a30Row pattern recognition patch (planner).
1690 - } 7521a30Row pattern recognition patch (planner).
1691 - 7521a30Row pattern recognition patch (planner).
1692 1120 branchIdx = branchFirst->jump; 7521a30Row pattern recognition patch (planner).
1693 - } 7521a30Row pattern recognition patch (planner).
1694 - 7521a30Row pattern recognition patch (planner).
1695 - /* Mark ALT element if any branch is absorbable */ 7521a30Row pattern recognition patch (planner).
1696 510 if (*hasAbsorbable) 7521a30Row pattern recognition patch (planner).
1697 170 elem->flags |= RPR_ELEM_ABSORBABLE_BRANCH; 7521a30Row pattern recognition patch (planner).
1698 - } 7521a30Row pattern recognition patch (planner).
1699 5155 else if (RPRElemIsBegin(elem)) 7521a30Row pattern recognition patch (planner).
1700 - { 7521a30Row pattern recognition patch (planner).
1701 - /* 7521a30Row pattern recognition patch (planner).
1702 - * BEGIN: first try to treat this BEGIN's children as an unbounded 7521a30Row pattern recognition patch (planner).
1703 - * group directly (handles nested fixed-length groups like ((A{2} 7521a30Row pattern recognition patch (planner).
1704 - * B{3}){2})+). If that fails, skip to first child and recurse as 7521a30Row pattern recognition patch (planner).
1705 - * before. 7521a30Row pattern recognition patch (planner).
1706 - */ 7521a30Row pattern recognition patch (planner).
1707 1910 if (isUnboundedStart(pattern, elem->next)) 7521a30Row pattern recognition patch (planner).
1708 - { 7521a30Row pattern recognition patch (planner).
1709 270 *hasAbsorbable = true; 7521a30Row pattern recognition patch (planner).
1710 270 elem->flags |= RPR_ELEM_ABSORBABLE_BRANCH; 7521a30Row pattern recognition patch (planner).
1711 - } 7521a30Row pattern recognition patch (planner).
1712 - else 7521a30Row pattern recognition patch (planner).
1713 - { 7521a30Row pattern recognition patch (planner).
1714 1640 computeAbsorbabilityRecursive(pattern, elem->next, hasAbsorbable); 7521a30Row pattern recognition patch (planner).
1715 - 7521a30Row pattern recognition patch (planner).
1716 - /* Mark BEGIN element if contents are absorbable */ 7521a30Row pattern recognition patch (planner).
1717 1640 if (*hasAbsorbable) 7521a30Row pattern recognition patch (planner).
1718 35 elem->flags |= RPR_ELEM_ABSORBABLE_BRANCH; 7521a30Row pattern recognition patch (planner).
1719 - } 7521a30Row pattern recognition patch (planner).
1720 - } 7521a30Row pattern recognition patch (planner).
1721 - else 7521a30Row pattern recognition patch (planner).
1722 - { 7521a30Row pattern recognition patch (planner).
1723 - /* Should never reach END - structural invariant of pattern parse tree */ 9c7e5bcImprove comments, documentation, and naming for row pattern recognition
1724 3245 Assert(!RPRElemIsEnd(elem)); 7521a30Row pattern recognition patch (planner).
1725 - 7521a30Row pattern recognition patch (planner).
1726 - /* Non-ALT, non-BEGIN: check if unbounded start */ 7521a30Row pattern recognition patch (planner).
1727 3245 if (isUnboundedStart(pattern, startIdx)) 7521a30Row pattern recognition patch (planner).
1728 - { 7521a30Row pattern recognition patch (planner).
1729 1180 *hasAbsorbable = true; 7521a30Row pattern recognition patch (planner).
1730 - } 7521a30Row pattern recognition patch (planner).
1731 - } 7521a30Row pattern recognition patch (planner).
1732 5665 } 7521a30Row pattern recognition patch (planner).
computeAbsorbability() lines 1764-1774
Modified Lines Coverage: 6/6 lines (100.0%)
LineHitsSourceCommit
1764 2905 computeAbsorbability(RPRPattern *pattern) 7521a30Row pattern recognition patch (planner).
1765 - { 7521a30Row pattern recognition patch (planner).
1766 2905 bool hasAbsorbable = false; 7521a30Row pattern recognition patch (planner).
1767 - 7521a30Row pattern recognition patch (planner).
1768 - /* Parser always produces at least one element + FIN */ 7521a30Row pattern recognition patch (planner).
1769 2905 Assert(pattern->numElements >= 2); 7521a30Row pattern recognition patch (planner).
1770 - 7521a30Row pattern recognition patch (planner).
1771 - /* Start recursion from first element */ 7521a30Row pattern recognition patch (planner).
1772 2905 computeAbsorbabilityRecursive(pattern, 0, &hasAbsorbable); 7521a30Row pattern recognition patch (planner).
1773 2905 pattern->isAbsorbable = hasAbsorbable; 7521a30Row pattern recognition patch (planner).
1774 2905 } 7521a30Row pattern recognition patch (planner).
rpr_volatile_func_checker() lines 1781-1784
Modified Lines Coverage: 2/2 lines (100.0%)
LineHitsSourceCommit
1781 11094 rpr_volatile_func_checker(Oid funcid, void *context) 7521a30Row pattern recognition patch (planner).
1782 - { 7521a30Row pattern recognition patch (planner).
1783 11094 return (func_volatile(funcid) == PROVOLATILE_VOLATILE); 7521a30Row pattern recognition patch (planner).
1784 - } 7521a30Row pattern recognition patch (planner).
rpr_define_errposition() lines 1795-1800
Modified Lines Coverage: 3/3 lines (100.0%)
LineHitsSourceCommit
1795 24 rpr_define_errposition(int location) 7521a30Row pattern recognition patch (planner).
1796 - { 7521a30Row pattern recognition patch (planner).
1797 24 if (location < 0 || debug_query_string == NULL) 7521a30Row pattern recognition patch (planner).
1798 - return 0; 7521a30Row pattern recognition patch (planner).
1799 20 return errposition(pg_mbstrlen_with_len(debug_query_string, location) + 1); 7521a30Row pattern recognition patch (planner).
1800 - } 7521a30Row pattern recognition patch (planner).
reject_volatile_in_define_walker() lines 1813-1828
Modified Lines Coverage: 6/7 lines (85.7%)
LineHitsSourceCommit
1813 36220 reject_volatile_in_define_walker(Node *node, void *context) 7521a30Row pattern recognition patch (planner).
1814 - { 7521a30Row pattern recognition patch (planner).
1815 36220 if (node == NULL) 7521a30Row pattern recognition patch (planner).
1816 - return false; 7521a30Row pattern recognition patch (planner).
1817 36135 if (check_functions_in_node(node, rpr_volatile_func_checker, NULL)) 7521a30Row pattern recognition patch (planner).
1818 24 ereport(ERROR, 7521a30Row pattern recognition patch (planner).
1819 - errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 7521a30Row pattern recognition patch (planner).
1820 - errmsg("volatile functions are not allowed in DEFINE clause"), 7521a30Row pattern recognition patch (planner).
1821 - rpr_define_errposition(exprLocation(node))); 7521a30Row pattern recognition patch (planner).
1822 36111 if (IsA(node, NextValueExpr)) 7521a30Row pattern recognition patch (planner).
1823 0 ereport(ERROR, 7521a30Row pattern recognition patch (planner).
1824 - errcode(ERRCODE_FEATURE_NOT_SUPPORTED), 7521a30Row pattern recognition patch (planner).
1825 - errmsg("sequence operations are not allowed in DEFINE clause"), 7521a30Row pattern recognition patch (planner).
1826 - rpr_define_errposition(exprLocation(node))); 7521a30Row pattern recognition patch (planner).
1827 36111 return expression_tree_walker(node, reject_volatile_in_define_walker, context); 7521a30Row pattern recognition patch (planner).
1828 - } 7521a30Row pattern recognition patch (planner).
validate_rpr_define_volatility() lines 1840-1846
Modified Lines Coverage: 4/4 lines (100.0%)
LineHitsSourceCommit
1840 3817 validate_rpr_define_volatility(List *defineClause) 7521a30Row pattern recognition patch (planner).
1841 - { 7521a30Row pattern recognition patch (planner).
1842 12564 foreach_node(TargetEntry, te, defineClause) 4cf9108Further tidy up row pattern recognition plumbing
1843 - { 7521a30Row pattern recognition patch (planner).
1844 8771 (void) reject_volatile_in_define_walker((Node *) te->expr, NULL); 7521a30Row pattern recognition patch (planner).
1845 - } 7521a30Row pattern recognition patch (planner).
1846 3793 } 7521a30Row pattern recognition patch (planner).
buildRPRPattern() lines 1863-1944
Modified Lines Coverage: 28/28 lines (100.0%)
LineHitsSourceCommit
1863 3793 buildRPRPattern(WindowClause *wc, bool hasMatchStartDependent) 7512d22Simplify row pattern compilation by passing the WindowClause
1864 - { 7521a30Row pattern recognition patch (planner).
1865 3793 RPRPattern *result; 7521a30Row pattern recognition patch (planner).
1866 3793 RPRPatternNode *optimized; 7521a30Row pattern recognition patch (planner).
1867 3793 char *varNamesStack[RPR_VARID_MAX + 1]; 7521a30Row pattern recognition patch (planner).
1868 3793 int numVars; 7521a30Row pattern recognition patch (planner).
1869 3793 int numElements; 7521a30Row pattern recognition patch (planner).
1870 3793 RPRDepth maxDepth; 7521a30Row pattern recognition patch (planner).
1871 3793 int idx; 7521a30Row pattern recognition patch (planner).
1872 3793 RPRPatternNode *pattern = wc->rpPattern; 7512d22Simplify row pattern compilation by passing the WindowClause
1873 3793 RPSkipTo rpSkipTo = wc->rpSkipTo; 7512d22Simplify row pattern compilation by passing the WindowClause
1874 3793 int frameOptions = wc->frameOptions; 7512d22Simplify row pattern compilation by passing the WindowClause
1875 - 7521a30Row pattern recognition patch (planner).
1876 - /* Caller must check for NULL pattern before calling */ 7521a30Row pattern recognition patch (planner).
1877 3793 Assert(pattern != NULL); 7521a30Row pattern recognition patch (planner).
1878 - /* RPR is ROWS-only: transformRPR() rejects RANGE/GROUPS up front */ 7521a30Row pattern recognition patch (planner).
1879 3793 Assert(frameOptions & FRAMEOPTION_ROWS); 7521a30Row pattern recognition patch (planner).
1880 - 7521a30Row pattern recognition patch (planner).
1881 - /* Optimize the pattern tree */ 7521a30Row pattern recognition patch (planner).
1882 3793 optimized = optimizeRPRPattern(copyObject(pattern)); 7521a30Row pattern recognition patch (planner).
1883 - 7521a30Row pattern recognition patch (planner).
1884 3793 numVars = 0; 7512d22Simplify row pattern compilation by passing the WindowClause
1885 - 7512d22Simplify row pattern compilation by passing the WindowClause
1886 - /* 7512d22Simplify row pattern compilation by passing the WindowClause
1887 - * Populate varNamesStack with the DEFINE variable names in DEFINE order. 7512d22Simplify row pattern compilation by passing the WindowClause
1888 - * This ensures varId == defineClause index, eliminating runtime mapping. 7512d22Simplify row pattern compilation by passing the WindowClause
1889 - */ 7512d22Simplify row pattern compilation by passing the WindowClause
1890 12540 foreach_node(TargetEntry, te, wc->defineClause) 7512d22Simplify row pattern compilation by passing the WindowClause
1891 - { 7512d22Simplify row pattern compilation by passing the WindowClause
1892 - /* Parser always assigns a name to each DEFINE entry */ 7512d22Simplify row pattern compilation by passing the WindowClause
1893 8747 Assert(te->resname != NULL); 7512d22Simplify row pattern compilation by passing the WindowClause
1894 - 7512d22Simplify row pattern compilation by passing the WindowClause
1895 8747 varNamesStack[numVars++] = pstrdup(te->resname); 7512d22Simplify row pattern compilation by passing the WindowClause
1896 - } 7512d22Simplify row pattern compilation by passing the WindowClause
1897 - 7521a30Row pattern recognition patch (planner).
1898 - /* Scan pattern: collect variables, count elements, validate limits */ 7521a30Row pattern recognition patch (planner).
1899 3793 scanRPRPattern(optimized, varNamesStack, &numVars, &numElements, &maxDepth); 7521a30Row pattern recognition patch (planner).
1900 - 7521a30Row pattern recognition patch (planner).
1901 - /* 7512d22Simplify row pattern compilation by passing the WindowClause
1902 - * numVars may reach RPR_VARID_MAX + 1 (valid varIds are 0 .. 7512d22Simplify row pattern compilation by passing the WindowClause
1903 - * RPR_VARID_MAX) 7512d22Simplify row pattern compilation by passing the WindowClause
1904 - */ 7512d22Simplify row pattern compilation by passing the WindowClause
1905 3785 Assert(numVars <= RPR_VARID_MAX + 1); 7512d22Simplify row pattern compilation by passing the WindowClause
1906 - 7512d22Simplify row pattern compilation by passing the WindowClause
1907 - /* Allocate result structure */ 7521a30Row pattern recognition patch (planner).
1908 3785 result = makeRPRPattern(numVars, numElements, maxDepth, varNamesStack); 7521a30Row pattern recognition patch (planner).
1909 - 7521a30Row pattern recognition patch (planner).
1910 - /* Fill elements (pass 2) */ 7521a30Row pattern recognition patch (planner).
1911 3785 idx = 0; 7521a30Row pattern recognition patch (planner).
1912 3785 fillRPRPattern(optimized, result, &idx, 0); 7521a30Row pattern recognition patch (planner).
1913 - 7521a30Row pattern recognition patch (planner).
1914 - /* Finalize: set up next pointers, flags, and add FIN marker */ 7521a30Row pattern recognition patch (planner).
1915 3785 finalizeRPRPattern(result); 7521a30Row pattern recognition patch (planner).
1916 - 7521a30Row pattern recognition patch (planner).
1917 - /* 7521a30Row pattern recognition patch (planner).
1918 - * Compute context absorption eligibility. Absorption requires both 7521a30Row pattern recognition patch (planner).
1919 - * structural absorbability and runtime conditions. Check runtime 7521a30Row pattern recognition patch (planner).
1920 - * conditions first to avoid unnecessary pattern analysis. 7521a30Row pattern recognition patch (planner).
1921 - * 7521a30Row pattern recognition patch (planner).
1922 - * Runtime conditions for absorption: 7521a30Row pattern recognition patch (planner).
1923 - * 7521a30Row pattern recognition patch (planner).
1924 - * 1. SKIP TO PAST LAST ROW required (not SKIP TO NEXT ROW): With NEXT 7521a30Row pattern recognition patch (planner).
1925 - * ROW, after each match the search resumes from the next row, so contexts 7521a30Row pattern recognition patch (planner).
1926 - * are immediately discarded. No redundant contexts accumulate, making 7521a30Row pattern recognition patch (planner).
1927 - * absorption unnecessary. 7521a30Row pattern recognition patch (planner).
1928 - * 7521a30Row pattern recognition patch (planner).
1929 - * 2. Unbounded frame end required (not ROWS with bounded end): With a 7521a30Row pattern recognition patch (planner).
1930 - * bounded frame (e.g., ROWS BETWEEN CURRENT ROW AND 10 FOLLOWING), 7521a30Row pattern recognition patch (planner).
1931 - * matches may be truncated at frame boundaries. This changes the 7521a30Row pattern recognition patch (planner).
1932 - * absorption semantics - older contexts don't necessarily produce longer 7521a30Row pattern recognition patch (planner).
1933 - * matches when frame limits apply differently to each context. 7521a30Row pattern recognition patch (planner).
1934 - */ 7521a30Row pattern recognition patch (planner).
1935 3785 if (rpSkipTo == ST_PAST_LAST_ROW && 7521a30Row pattern recognition patch (planner).
1936 3175 (frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING) && 7521a30Row pattern recognition patch (planner).
1937 - !hasMatchStartDependent) 7521a30Row pattern recognition patch (planner).
1938 - { 7521a30Row pattern recognition patch (planner).
1939 - /* Runtime conditions met - check structural absorbability */ 7521a30Row pattern recognition patch (planner).
1940 2905 computeAbsorbability(result); 7521a30Row pattern recognition patch (planner).
1941 - } 7521a30Row pattern recognition patch (planner).
1942 - 7521a30Row pattern recognition patch (planner).
1943 3785 return result; 7521a30Row pattern recognition patch (planner).
1944 - } 7521a30Row pattern recognition patch (planner).
nav_traversal_walker() lines 1963-1977
Modified Lines Coverage: 7/7 lines (100.0%)
LineHitsSourceCommit
1963 31780 nav_traversal_walker(Node *node, void *ctx) 7521a30Row pattern recognition patch (planner).
1964 - { 7521a30Row pattern recognition patch (planner).
1965 31780 if (node == NULL) 7521a30Row pattern recognition patch (planner).
1966 - return false; 7521a30Row pattern recognition patch (planner).
1967 - 7521a30Row pattern recognition patch (planner).
1968 31695 if (IsA(node, RPRNavExpr)) 7521a30Row pattern recognition patch (planner).
1969 - { 7521a30Row pattern recognition patch (planner).
1970 1368 NavTraversal *t = (NavTraversal *) ctx; 7521a30Row pattern recognition patch (planner).
1971 - 7521a30Row pattern recognition patch (planner).
1972 1368 t->visit(t, (RPRNavExpr *) node); 7521a30Row pattern recognition patch (planner).
1973 1368 return false; 7521a30Row pattern recognition patch (planner).
1974 - } 7521a30Row pattern recognition patch (planner).
1975 - 7521a30Row pattern recognition patch (planner).
1976 30327 return expression_tree_walker(node, nav_traversal_walker, ctx); 7521a30Row pattern recognition patch (planner).
1977 - } 7521a30Row pattern recognition patch (planner).