| Line | Hits | Source | Commit |
| 3956 |
81 |
transformDefineClause(ParseState *pstate, WindowClause *wc, WindowDef *windef, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3957 |
- |
List **targetlist) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3958 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3959 |
- |
/* DEFINE variable name initials */ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3960 |
81 |
static const char *defineVariableInitials = "abcdefghijklmnopqrstuvwxyz"; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3961 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3962 |
81 |
ListCell *lc, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3963 |
- |
*l; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3964 |
81 |
ResTarget *restarget, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3965 |
- |
*r; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3966 |
81 |
List *restargets; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3967 |
81 |
List *defineClause; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3968 |
81 |
char *name; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3969 |
81 |
int initialLen; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3970 |
81 |
int numinitials; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3971 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3972 |
- |
/* |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3973 |
- |
* If Row Definition Common Syntax exists, DEFINE clause must exist. (the |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3974 |
- |
* raw parser should have already checked it.) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3975 |
- |
*/ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3976 |
81 |
Assert(windef->rpCommonSyntax->rpDefs != NULL); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3977 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3978 |
- |
/* |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3979 |
- |
* Check and add "A AS A IS TRUE" if pattern variable is missing in DEFINE |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3980 |
- |
* per the SQL standard. |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3981 |
- |
*/ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3982 |
81 |
restargets = NIL; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3983 |
282 |
foreach(lc, windef->rpCommonSyntax->rpPatterns) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3984 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3985 |
201 |
A_Expr *a; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3986 |
201 |
bool found = false; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3987 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3988 |
201 |
if (!IsA(lfirst(lc), A_Expr)) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3989 |
0 |
ereport(ERROR, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3990 |
- |
errmsg("node type is not A_Expr")); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3991 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3992 |
201 |
a = (A_Expr *) lfirst(lc); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3993 |
201 |
name = strVal(a->lexpr); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3994 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3995 |
360 |
foreach(l, windef->rpCommonSyntax->rpDefs) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3996 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3997 |
357 |
restarget = (ResTarget *) lfirst(l); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3998 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 3999 |
357 |
if (!strcmp(restarget->name, name)) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4000 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4001 |
- |
found = true; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4002 |
- |
break; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4003 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4004 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4005 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4006 |
201 |
if (!found) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4007 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4008 |
- |
/* |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4009 |
- |
* "name" is missing. So create "name AS name IS TRUE" ResTarget |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4010 |
- |
* node and add it to the temporary list. |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4011 |
- |
*/ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4012 |
3 |
A_Const *n; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4013 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4014 |
3 |
restarget = makeNode(ResTarget); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4015 |
3 |
n = makeNode(A_Const); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4016 |
3 |
n->val.boolval.type = T_Boolean; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4017 |
3 |
n->val.boolval.boolval = true; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4018 |
3 |
n->location = -1; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4019 |
3 |
restarget->name = pstrdup(name); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4020 |
3 |
restarget->indirection = NIL; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4021 |
3 |
restarget->val = (Node *) n; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4022 |
3 |
restarget->location = -1; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4023 |
3 |
restargets = lappend((List *) restargets, restarget); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4024 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4025 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4026 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4027 |
81 |
if (list_length(restargets) >= 1) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4028 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4029 |
- |
/* add missing DEFINEs */ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4030 |
6 |
windef->rpCommonSyntax->rpDefs = |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4031 |
3 |
list_concat(windef->rpCommonSyntax->rpDefs, restargets); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4032 |
3 |
list_free(restargets); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4033 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4034 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4035 |
- |
/* |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4036 |
- |
* Check for duplicate row pattern definition variables. The standard |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4037 |
- |
* requires that no two row pattern definition variable names shall be |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4038 |
- |
* equivalent. |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4039 |
- |
*/ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4040 |
81 |
restargets = NIL; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4041 |
81 |
numinitials = 0; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4042 |
81 |
initialLen = strlen(defineVariableInitials); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4043 |
267 |
foreach(lc, windef->rpCommonSyntax->rpDefs) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4044 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4045 |
195 |
char initial[2]; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4046 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4047 |
195 |
restarget = (ResTarget *) lfirst(lc); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4048 |
195 |
name = restarget->name; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4049 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4050 |
- |
/* |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4051 |
- |
* Add DEFINE expression (Restarget->val) to the targetlist as a |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4052 |
- |
* TargetEntry if it does not exist yet. Planner will add the column |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4053 |
- |
* ref var node to the outer plan's target list later on. This makes |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4054 |
- |
* DEFINE expression could access the outer tuple while evaluating |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4055 |
- |
* PATTERN. |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4056 |
- |
* |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4057 |
- |
* XXX: adding whole expressions of DEFINE to the plan.targetlist is |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4058 |
- |
* not so good, because it's not necessary to evalute the expression |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4059 |
- |
* in the target list while running the plan. We should extract the |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4060 |
- |
* var nodes only then add them to the plan.targetlist. |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4061 |
- |
*/ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4062 |
195 |
findTargetlistEntrySQL99(pstate, (Node *) restarget->val, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4063 |
- |
targetlist, EXPR_KIND_RPR_DEFINE); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4064 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4065 |
- |
/* |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4066 |
- |
* Make sure that the row pattern definition search condition is a |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4067 |
- |
* boolean expression. |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4068 |
- |
*/ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4069 |
189 |
transformWhereClause(pstate, restarget->val, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4070 |
- |
EXPR_KIND_RPR_DEFINE, "DEFINE"); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4071 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4072 |
342 |
foreach(l, restargets) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4073 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4074 |
156 |
char *n; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4075 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4076 |
156 |
r = (ResTarget *) lfirst(l); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4077 |
156 |
n = r->name; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4078 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4079 |
156 |
if (!strcmp(n, name)) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4080 |
156 |
ereport(ERROR, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4081 |
- |
(errcode(ERRCODE_SYNTAX_ERROR), |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4082 |
- |
errmsg("row pattern definition variable name \"%s\" appears more than once in DEFINE clause", |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4083 |
- |
name), |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4084 |
- |
parser_errposition(pstate, exprLocation((Node *) r)))); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4085 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4086 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4087 |
- |
/* |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4088 |
- |
* Create list of row pattern DEFINE variable name's initial. We |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4089 |
- |
* assign [a-z] to them (up to 26 variable names are allowed). |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4090 |
- |
*/ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4091 |
186 |
if (numinitials >= initialLen) |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4092 |
- |
{ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4093 |
0 |
ereport(ERROR, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4094 |
- |
(errcode(ERRCODE_SYNTAX_ERROR), |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4095 |
- |
errmsg("number of row pattern definition variable names exceeds %d", |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4096 |
- |
initialLen), |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4097 |
- |
parser_errposition(pstate, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4098 |
- |
exprLocation((Node *) restarget)))); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4099 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4100 |
186 |
initial[0] = defineVariableInitials[numinitials++]; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4101 |
186 |
initial[1] = '\0'; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4102 |
186 |
wc->defineInitial = lappend(wc->defineInitial, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4103 |
186 |
makeString(pstrdup(initial))); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4104 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4105 |
186 |
restargets = lappend(restargets, restarget); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4106 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4107 |
72 |
list_free(restargets); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4108 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4109 |
- |
/* turns a list of ResTarget's into a list of TargetEntry's */ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4110 |
72 |
defineClause = transformTargetList(pstate, windef->rpCommonSyntax->rpDefs, |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4111 |
- |
EXPR_KIND_RPR_DEFINE); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4112 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4113 |
- |
/* mark column origins */ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4114 |
72 |
markTargetListOrigins(pstate, defineClause); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4115 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4116 |
- |
/* mark all nodes in the DEFINE clause tree with collation information */ |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4117 |
72 |
assign_expr_collations(pstate, (Node *) defineClause); |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4118 |
- |
|
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4119 |
72 |
return defineClause; |
b8a35c3Row pattern recognition patch (parse/analysis). |
| 4120 |
- |
} |
b8a35c3Row pattern recognition patch (parse/analysis). |