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