| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |
| Line | Hits | Source | Commit |
|---|---|---|---|
| 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). |