← Back to Overview

src/backend/parser/parse_clause.c

Coverage: 88/91 lines (96.7%)
Total Lines
91
modified
Covered
88
96.7%
Uncovered
3
3.3%
키보드 네비게이션
transformWindowDefinitions() lines 2832-3037
Modified Lines Coverage: 1/1 lines (100.0%)
LineHitsSourceCommit
2832 - transformWindowDefinitions(ParseState *pstate, -
2833 - List *windowdefs, -
2834 - List **targetlist) -
2835 - { -
2836 - List *result = NIL; -
2837 - Index winref = 0; -
2838 - ListCell *lc; -
2839 - -
2840 - foreach(lc, windowdefs) -
2841 - { -
2842 - WindowDef *windef = (WindowDef *) lfirst(lc); -
2843 - WindowClause *refwc = NULL; -
2844 - List *partitionClause; -
2845 - List *orderClause; -
2846 - Oid rangeopfamily = InvalidOid; -
2847 - Oid rangeopcintype = InvalidOid; -
2848 - WindowClause *wc; -
2849 - -
2850 - winref++; -
2851 - -
2852 - /* -
2853 - * Check for duplicate window names. -
2854 - */ -
2855 - if (windef->name && -
2856 - findWindowClause(result, windef->name) != NULL) -
2857 - ereport(ERROR, -
2858 - (errcode(ERRCODE_WINDOWING_ERROR), -
2859 - errmsg("window \"%s\" is already defined", windef->name), -
2860 - parser_errposition(pstate, windef->location))); -
2861 - -
2862 - /* -
2863 - * If it references a previous window, look that up. -
2864 - */ -
2865 - if (windef->refname) -
2866 - { -
2867 - refwc = findWindowClause(result, windef->refname); -
2868 - if (refwc == NULL) -
2869 - ereport(ERROR, -
2870 - (errcode(ERRCODE_UNDEFINED_OBJECT), -
2871 - errmsg("window \"%s\" does not exist", -
2872 - windef->refname), -
2873 - parser_errposition(pstate, windef->location))); -
2874 - } -
2875 - -
2876 - /* -
2877 - * Transform PARTITION and ORDER specs, if any. These are treated -
2878 - * almost exactly like top-level GROUP BY and ORDER BY clauses, -
2879 - * including the special handling of nondefault operator semantics. -
2880 - */ -
2881 - orderClause = transformSortClause(pstate, -
2882 - windef->orderClause, -
2883 - targetlist, -
2884 - EXPR_KIND_WINDOW_ORDER, -
2885 - true /* force SQL99 rules */ ); -
2886 - partitionClause = transformGroupClause(pstate, -
2887 - windef->partitionClause, -
2888 - false /* not GROUP BY ALL */ , -
2889 - NULL, -
2890 - targetlist, -
2891 - orderClause, -
2892 - EXPR_KIND_WINDOW_PARTITION, -
2893 - true /* force SQL99 rules */ ); -
2894 - -
2895 - /* -
2896 - * And prepare the new WindowClause. -
2897 - */ -
2898 - wc = makeNode(WindowClause); -
2899 - wc->name = windef->name; -
2900 - wc->refname = windef->refname; -
2901 - -
2902 - /* -
2903 - * Per spec, a windowdef that references a previous one copies the -
2904 - * previous partition clause (and mustn't specify its own). It can -
2905 - * specify its own ordering clause, but only if the previous one had -
2906 - * none. It always specifies its own frame clause, and the previous -
2907 - * one must not have a frame clause. Yeah, it's bizarre that each of -
2908 - * these cases works differently, but SQL:2008 says so; see 7.11 -
2909 - * <window clause> syntax rule 10 and general rule 1. The frame -
2910 - * clause rule is especially bizarre because it makes "OVER foo" -
2911 - * different from "OVER (foo)", and requires the latter to throw an -
2912 - * error if foo has a nondefault frame clause. Well, ours not to -
2913 - * reason why, but we do go out of our way to throw a useful error -
2914 - * message for such cases. -
2915 - */ -
2916 - if (refwc) -
2917 - { -
2918 - if (partitionClause) -
2919 - ereport(ERROR, -
2920 - (errcode(ERRCODE_WINDOWING_ERROR), -
2921 - errmsg("cannot override PARTITION BY clause of window \"%s\"", -
2922 - windef->refname), -
2923 - parser_errposition(pstate, windef->location))); -
2924 - wc->partitionClause = copyObject(refwc->partitionClause); -
2925 - } -
2926 - else -
2927 - wc->partitionClause = partitionClause; -
2928 - if (refwc) -
2929 - { -
2930 - if (orderClause && refwc->orderClause) -
2931 - ereport(ERROR, -
2932 - (errcode(ERRCODE_WINDOWING_ERROR), -
2933 - errmsg("cannot override ORDER BY clause of window \"%s\"", -
2934 - windef->refname), -
2935 - parser_errposition(pstate, windef->location))); -
2936 - if (orderClause) -
2937 - { -
2938 - wc->orderClause = orderClause; -
2939 - wc->copiedOrder = false; -
2940 - } -
2941 - else -
2942 - { -
2943 - wc->orderClause = copyObject(refwc->orderClause); -
2944 - wc->copiedOrder = true; -
2945 - } -
2946 - } -
2947 - else -
2948 - { -
2949 - wc->orderClause = orderClause; -
2950 - wc->copiedOrder = false; -
2951 - } -
2952 - if (refwc && refwc->frameOptions != FRAMEOPTION_DEFAULTS) -
2953 - { -
2954 - /* -
2955 - * Use this message if this is a WINDOW clause, or if it's an OVER -
2956 - * clause that includes ORDER BY or framing clauses. (We already -
2957 - * rejected PARTITION BY above, so no need to check that.) -
2958 - */ -
2959 - if (windef->name || -
2960 - orderClause || windef->frameOptions != FRAMEOPTION_DEFAULTS) -
2961 - ereport(ERROR, -
2962 - (errcode(ERRCODE_WINDOWING_ERROR), -
2963 - errmsg("cannot copy window \"%s\" because it has a frame clause", -
2964 - windef->refname), -
2965 - parser_errposition(pstate, windef->location))); -
2966 - /* Else this clause is just OVER (foo), so say this: */ -
2967 - ereport(ERROR, -
2968 - (errcode(ERRCODE_WINDOWING_ERROR), -
2969 - errmsg("cannot copy window \"%s\" because it has a frame clause", -
2970 - windef->refname), -
2971 - errhint("Omit the parentheses in this OVER clause."), -
2972 - parser_errposition(pstate, windef->location))); -
2973 - } -
2974 - wc->frameOptions = windef->frameOptions; -
2975 - -
2976 - /* -
2977 - * RANGE offset PRECEDING/FOLLOWING requires exactly one ORDER BY -
2978 - * column; check that and get its sort opfamily info. -
2979 - */ -
2980 - if ((wc->frameOptions & FRAMEOPTION_RANGE) && -
2981 - (wc->frameOptions & (FRAMEOPTION_START_OFFSET | -
2982 - FRAMEOPTION_END_OFFSET))) -
2983 - { -
2984 - SortGroupClause *sortcl; -
2985 - Node *sortkey; -
2986 - CompareType rangecmptype; -
2987 - -
2988 - if (list_length(wc->orderClause) != 1) -
2989 - ereport(ERROR, -
2990 - (errcode(ERRCODE_WINDOWING_ERROR), -
2991 - errmsg("RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column"), -
2992 - parser_errposition(pstate, windef->location))); -
2993 - sortcl = linitial_node(SortGroupClause, wc->orderClause); -
2994 - sortkey = get_sortgroupclause_expr(sortcl, *targetlist); -
2995 - /* Find the sort operator in pg_amop */ -
2996 - if (!get_ordering_op_properties(sortcl->sortop, -
2997 - &rangeopfamily, -
2998 - &rangeopcintype, -
2999 - &rangecmptype)) -
3000 - elog(ERROR, "operator %u is not a valid ordering operator", -
3001 - sortcl->sortop); -
3002 - /* Record properties of sort ordering */ -
3003 - wc->inRangeColl = exprCollation(sortkey); -
3004 - wc->inRangeAsc = !sortcl->reverse_sort; -
3005 - wc->inRangeNullsFirst = sortcl->nulls_first; -
3006 - } -
3007 - -
3008 - /* Per spec, GROUPS mode requires an ORDER BY clause */ -
3009 - if (wc->frameOptions & FRAMEOPTION_GROUPS) -
3010 - { -
3011 - if (wc->orderClause == NIL) -
3012 - ereport(ERROR, -
3013 - (errcode(ERRCODE_WINDOWING_ERROR), -
3014 - errmsg("GROUPS mode requires an ORDER BY clause"), -
3015 - parser_errposition(pstate, windef->location))); -
3016 - } -
3017 - -
3018 - /* Process frame offset expressions */ -
3019 - wc->startOffset = transformFrameOffset(pstate, wc->frameOptions, -
3020 - rangeopfamily, rangeopcintype, -
3021 - &wc->startInRangeFunc, -
3022 - windef->startOffset); -
3023 - wc->endOffset = transformFrameOffset(pstate, wc->frameOptions, -
3024 - rangeopfamily, rangeopcintype, -
3025 - &wc->endInRangeFunc, -
3026 - windef->endOffset); -
3027 - b8a35c3Row pattern recognition patch (parse/analysis).
3028 - /* Process Row Pattern Recognition related clauses */ b8a35c3Row pattern recognition patch (parse/analysis).
3029 1564 transformRPR(pstate, wc, windef, targetlist); b8a35c3Row pattern recognition patch (parse/analysis).
3030 - b8a35c3Row pattern recognition patch (parse/analysis).
3031 - wc->winref = winref; -
3032 - -
3033 - result = lappend(result, wc); -
3034 - } -
3035 - -
3036 - return result; -
3037 - } -
transformRPR() lines 3912-3944
Modified Lines Coverage: 9/9 lines (100.0%)
LineHitsSourceCommit
3912 1564 transformRPR(ParseState *pstate, WindowClause *wc, WindowDef *windef, b8a35c3Row pattern recognition patch (parse/analysis).
3913 - List **targetlist) b8a35c3Row pattern recognition patch (parse/analysis).
3914 - { b8a35c3Row pattern recognition patch (parse/analysis).
3915 - /* b8a35c3Row pattern recognition patch (parse/analysis).
3916 - * Window definition exists? b8a35c3Row pattern recognition patch (parse/analysis).
3917 - */ b8a35c3Row pattern recognition patch (parse/analysis).
3918 1564 if (windef == NULL) b8a35c3Row pattern recognition patch (parse/analysis).
3919 - return; b8a35c3Row pattern recognition patch (parse/analysis).
3920 - b8a35c3Row pattern recognition patch (parse/analysis).
3921 - /* b8a35c3Row pattern recognition patch (parse/analysis).
3922 - * Row Pattern Common Syntax clause exists? b8a35c3Row pattern recognition patch (parse/analysis).
3923 - */ b8a35c3Row pattern recognition patch (parse/analysis).
3924 1564 if (windef->rpCommonSyntax == NULL) b8a35c3Row pattern recognition patch (parse/analysis).
3925 - return; b8a35c3Row pattern recognition patch (parse/analysis).
3926 - b8a35c3Row pattern recognition patch (parse/analysis).
3927 - /* Check Frame option. Frame must start at current row */ b8a35c3Row pattern recognition patch (parse/analysis).
3928 84 if ((wc->frameOptions & FRAMEOPTION_START_CURRENT_ROW) == 0) b8a35c3Row pattern recognition patch (parse/analysis).
3929 3 ereport(ERROR, b8a35c3Row pattern recognition patch (parse/analysis).
3930 - (errcode(ERRCODE_SYNTAX_ERROR), b8a35c3Row pattern recognition patch (parse/analysis).
3931 - errmsg("FRAME must start at current row when row pattern recognition is used"))); b8a35c3Row pattern recognition patch (parse/analysis).
3932 - b8a35c3Row pattern recognition patch (parse/analysis).
3933 - /* Transform AFTER MACH SKIP TO clause */ b8a35c3Row pattern recognition patch (parse/analysis).
3934 81 wc->rpSkipTo = windef->rpCommonSyntax->rpSkipTo; b8a35c3Row pattern recognition patch (parse/analysis).
3935 - b8a35c3Row pattern recognition patch (parse/analysis).
3936 - /* Transform SEEK or INITIAL clause */ b8a35c3Row pattern recognition patch (parse/analysis).
3937 81 wc->initial = windef->rpCommonSyntax->initial; b8a35c3Row pattern recognition patch (parse/analysis).
3938 - b8a35c3Row pattern recognition patch (parse/analysis).
3939 - /* Transform DEFINE clause into list of TargetEntry's */ b8a35c3Row pattern recognition patch (parse/analysis).
3940 81 wc->defineClause = transformDefineClause(pstate, wc, windef, targetlist); b8a35c3Row pattern recognition patch (parse/analysis).
3941 - b8a35c3Row pattern recognition patch (parse/analysis).
3942 - /* Check PATTERN clause and copy to patternClause */ b8a35c3Row pattern recognition patch (parse/analysis).
3943 72 transformPatternClause(pstate, wc, windef); b8a35c3Row pattern recognition patch (parse/analysis).
3944 - } b8a35c3Row pattern recognition patch (parse/analysis).
transformDefineClause() lines 3956-4120
Modified Lines Coverage: 62/64 lines (96.9%)
LineHitsSourceCommit
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).
transformPatternClause() lines 4129-4156
Modified Lines Coverage: 16/17 lines (94.1%)
LineHitsSourceCommit
4129 72 transformPatternClause(ParseState *pstate, WindowClause *wc, b8a35c3Row pattern recognition patch (parse/analysis).
4130 - WindowDef *windef) b8a35c3Row pattern recognition patch (parse/analysis).
4131 - { b8a35c3Row pattern recognition patch (parse/analysis).
4132 72 ListCell *lc; b8a35c3Row pattern recognition patch (parse/analysis).
4133 - b8a35c3Row pattern recognition patch (parse/analysis).
4134 72 Assert(windef->rpCommonSyntax != NULL); b8a35c3Row pattern recognition patch (parse/analysis).
4135 - b8a35c3Row pattern recognition patch (parse/analysis).
4136 72 wc->patternVariable = NIL; b8a35c3Row pattern recognition patch (parse/analysis).
4137 72 wc->patternRegexp = NIL; b8a35c3Row pattern recognition patch (parse/analysis).
4138 252 foreach(lc, windef->rpCommonSyntax->rpPatterns) b8a35c3Row pattern recognition patch (parse/analysis).
4139 - { b8a35c3Row pattern recognition patch (parse/analysis).
4140 180 A_Expr *a; b8a35c3Row pattern recognition patch (parse/analysis).
4141 180 char *name; b8a35c3Row pattern recognition patch (parse/analysis).
4142 180 char *regexp; b8a35c3Row pattern recognition patch (parse/analysis).
4143 - b8a35c3Row pattern recognition patch (parse/analysis).
4144 180 if (!IsA(lfirst(lc), A_Expr)) b8a35c3Row pattern recognition patch (parse/analysis).
4145 0 ereport(ERROR, b8a35c3Row pattern recognition patch (parse/analysis).
4146 - errmsg("node type is not A_Expr")); b8a35c3Row pattern recognition patch (parse/analysis).
4147 - b8a35c3Row pattern recognition patch (parse/analysis).
4148 180 a = (A_Expr *) lfirst(lc); b8a35c3Row pattern recognition patch (parse/analysis).
4149 180 name = strVal(a->lexpr); b8a35c3Row pattern recognition patch (parse/analysis).
4150 - b8a35c3Row pattern recognition patch (parse/analysis).
4151 180 wc->patternVariable = lappend(wc->patternVariable, makeString(pstrdup(name))); b8a35c3Row pattern recognition patch (parse/analysis).
4152 180 regexp = strVal(lfirst(list_head(a->name))); b8a35c3Row pattern recognition patch (parse/analysis).
4153 - b8a35c3Row pattern recognition patch (parse/analysis).
4154 180 wc->patternRegexp = lappend(wc->patternRegexp, makeString(pstrdup(regexp))); b8a35c3Row pattern recognition patch (parse/analysis).
4155 - } b8a35c3Row pattern recognition patch (parse/analysis).
4156 72 } b8a35c3Row pattern recognition patch (parse/analysis).