← Back to Overview

src/backend/parser/parse_agg.c

Coverage: 0/0 lines (0.0%)
Total Lines
0
modified
Covered
0
0.0%
Uncovered
0
100.0%
키보드 네비게이션
check_agglevels_and_constraints() lines 307-621
Modified Lines Coverage: 0/0 lines (0.0%)
LineHitsSourceCommit
307 - check_agglevels_and_constraints(ParseState *pstate, Node *expr) -
308 - { -
309 - List *directargs = NIL; -
310 - List *args = NIL; -
311 - Expr *filter = NULL; -
312 - int min_varlevel; -
313 - int location = -1; -
314 - Index *p_levelsup; -
315 - const char *err; -
316 - bool errkind; -
317 - bool isAgg = IsA(expr, Aggref); -
318 - -
319 - if (isAgg) -
320 - { -
321 - Aggref *agg = (Aggref *) expr; -
322 - -
323 - directargs = agg->aggdirectargs; -
324 - args = agg->args; -
325 - filter = agg->aggfilter; -
326 - location = agg->location; -
327 - p_levelsup = &agg->agglevelsup; -
328 - } -
329 - else -
330 - { -
331 - GroupingFunc *grp = (GroupingFunc *) expr; -
332 - -
333 - args = grp->args; -
334 - location = grp->location; -
335 - p_levelsup = &grp->agglevelsup; -
336 - } -
337 - -
338 - /* -
339 - * Check the arguments to compute the aggregate's level and detect -
340 - * improper nesting. -
341 - */ -
342 - min_varlevel = check_agg_arguments(pstate, -
343 - directargs, -
344 - args, -
345 - filter, -
346 - location); -
347 - -
348 - *p_levelsup = min_varlevel; -
349 - -
350 - /* Mark the correct pstate level as having aggregates */ -
351 - while (min_varlevel-- > 0) -
352 - pstate = pstate->parentParseState; -
353 - pstate->p_hasAggs = true; -
354 - -
355 - /* -
356 - * Check to see if the aggregate function is in an invalid place within -
357 - * its aggregation query. -
358 - * -
359 - * For brevity we support two schemes for reporting an error here: set -
360 - * "err" to a custom message, or set "errkind" true if the error context -
361 - * is sufficiently identified by what ParseExprKindName will return, *and* -
362 - * what it will return is just a SQL keyword. (Otherwise, use a custom -
363 - * message to avoid creating translation problems.) -
364 - */ -
365 - err = NULL; -
366 - errkind = false; -
367 - switch (pstate->p_expr_kind) -
368 - { -
369 - case EXPR_KIND_NONE: -
370 - Assert(false); /* can't happen */ -
371 - break; -
372 - case EXPR_KIND_OTHER: -
373 - -
374 - /* -
375 - * Accept aggregate/grouping here; caller must throw error if -
376 - * wanted -
377 - */ -
378 - break; -
379 - case EXPR_KIND_JOIN_ON: -
380 - case EXPR_KIND_JOIN_USING: -
381 - if (isAgg) -
382 - err = _("aggregate functions are not allowed in JOIN conditions"); -
383 - else -
384 - err = _("grouping operations are not allowed in JOIN conditions"); -
385 - -
386 - break; -
387 - case EXPR_KIND_FROM_SUBSELECT: -
388 - -
389 - /* -
390 - * Aggregate/grouping scope rules make it worth being explicit -
391 - * here -
392 - */ -
393 - if (isAgg) -
394 - err = _("aggregate functions are not allowed in FROM clause of their own query level"); -
395 - else -
396 - err = _("grouping operations are not allowed in FROM clause of their own query level"); -
397 - -
398 - break; -
399 - case EXPR_KIND_FROM_FUNCTION: -
400 - if (isAgg) -
401 - err = _("aggregate functions are not allowed in functions in FROM"); -
402 - else -
403 - err = _("grouping operations are not allowed in functions in FROM"); -
404 - -
405 - break; -
406 - case EXPR_KIND_WHERE: -
407 - errkind = true; -
408 - break; -
409 - case EXPR_KIND_POLICY: -
410 - if (isAgg) -
411 - err = _("aggregate functions are not allowed in policy expressions"); -
412 - else -
413 - err = _("grouping operations are not allowed in policy expressions"); -
414 - -
415 - break; -
416 - case EXPR_KIND_HAVING: -
417 - /* okay */ -
418 - break; -
419 - case EXPR_KIND_FILTER: -
420 - errkind = true; -
421 - break; -
422 - case EXPR_KIND_WINDOW_PARTITION: -
423 - /* okay */ -
424 - break; -
425 - case EXPR_KIND_WINDOW_ORDER: -
426 - /* okay */ -
427 - break; -
428 - case EXPR_KIND_WINDOW_FRAME_RANGE: -
429 - if (isAgg) -
430 - err = _("aggregate functions are not allowed in window RANGE"); -
431 - else -
432 - err = _("grouping operations are not allowed in window RANGE"); -
433 - -
434 - break; -
435 - case EXPR_KIND_WINDOW_FRAME_ROWS: -
436 - if (isAgg) -
437 - err = _("aggregate functions are not allowed in window ROWS"); -
438 - else -
439 - err = _("grouping operations are not allowed in window ROWS"); -
440 - -
441 - break; -
442 - case EXPR_KIND_WINDOW_FRAME_GROUPS: -
443 - if (isAgg) -
444 - err = _("aggregate functions are not allowed in window GROUPS"); -
445 - else -
446 - err = _("grouping operations are not allowed in window GROUPS"); -
447 - -
448 - break; -
449 - case EXPR_KIND_SELECT_TARGET: -
450 - /* okay */ -
451 - break; -
452 - case EXPR_KIND_INSERT_TARGET: -
453 - case EXPR_KIND_UPDATE_SOURCE: -
454 - case EXPR_KIND_UPDATE_TARGET: -
455 - errkind = true; -
456 - break; -
457 - case EXPR_KIND_MERGE_WHEN: -
458 - if (isAgg) -
459 - err = _("aggregate functions are not allowed in MERGE WHEN conditions"); -
460 - else -
461 - err = _("grouping operations are not allowed in MERGE WHEN conditions"); -
462 - -
463 - break; -
464 - case EXPR_KIND_GROUP_BY: -
465 - errkind = true; -
466 - break; -
467 - case EXPR_KIND_ORDER_BY: -
468 - /* okay */ -
469 - break; -
470 - case EXPR_KIND_DISTINCT_ON: -
471 - /* okay */ -
472 - break; -
473 - case EXPR_KIND_LIMIT: -
474 - case EXPR_KIND_OFFSET: -
475 - errkind = true; -
476 - break; -
477 - case EXPR_KIND_RETURNING: -
478 - case EXPR_KIND_MERGE_RETURNING: -
479 - errkind = true; -
480 - break; -
481 - case EXPR_KIND_VALUES: -
482 - case EXPR_KIND_VALUES_SINGLE: -
483 - errkind = true; -
484 - break; -
485 - case EXPR_KIND_CHECK_CONSTRAINT: -
486 - case EXPR_KIND_DOMAIN_CHECK: -
487 - if (isAgg) -
488 - err = _("aggregate functions are not allowed in check constraints"); -
489 - else -
490 - err = _("grouping operations are not allowed in check constraints"); -
491 - -
492 - break; -
493 - case EXPR_KIND_COLUMN_DEFAULT: -
494 - case EXPR_KIND_FUNCTION_DEFAULT: -
495 - -
496 - if (isAgg) -
497 - err = _("aggregate functions are not allowed in DEFAULT expressions"); -
498 - else -
499 - err = _("grouping operations are not allowed in DEFAULT expressions"); -
500 - -
501 - break; -
502 - case EXPR_KIND_INDEX_EXPRESSION: -
503 - if (isAgg) -
504 - err = _("aggregate functions are not allowed in index expressions"); -
505 - else -
506 - err = _("grouping operations are not allowed in index expressions"); -
507 - -
508 - break; -
509 - case EXPR_KIND_INDEX_PREDICATE: -
510 - if (isAgg) -
511 - err = _("aggregate functions are not allowed in index predicates"); -
512 - else -
513 - err = _("grouping operations are not allowed in index predicates"); -
514 - -
515 - break; -
516 - case EXPR_KIND_STATS_EXPRESSION: -
517 - if (isAgg) -
518 - err = _("aggregate functions are not allowed in statistics expressions"); -
519 - else -
520 - err = _("grouping operations are not allowed in statistics expressions"); -
521 - -
522 - break; -
523 - case EXPR_KIND_ALTER_COL_TRANSFORM: -
524 - if (isAgg) -
525 - err = _("aggregate functions are not allowed in transform expressions"); -
526 - else -
527 - err = _("grouping operations are not allowed in transform expressions"); -
528 - -
529 - break; -
530 - case EXPR_KIND_EXECUTE_PARAMETER: -
531 - if (isAgg) -
532 - err = _("aggregate functions are not allowed in EXECUTE parameters"); -
533 - else -
534 - err = _("grouping operations are not allowed in EXECUTE parameters"); -
535 - -
536 - break; -
537 - case EXPR_KIND_TRIGGER_WHEN: -
538 - if (isAgg) -
539 - err = _("aggregate functions are not allowed in trigger WHEN conditions"); -
540 - else -
541 - err = _("grouping operations are not allowed in trigger WHEN conditions"); -
542 - -
543 - break; -
544 - case EXPR_KIND_PARTITION_BOUND: -
545 - if (isAgg) -
546 - err = _("aggregate functions are not allowed in partition bound"); -
547 - else -
548 - err = _("grouping operations are not allowed in partition bound"); -
549 - -
550 - break; -
551 - case EXPR_KIND_PARTITION_EXPRESSION: -
552 - if (isAgg) -
553 - err = _("aggregate functions are not allowed in partition key expressions"); -
554 - else -
555 - err = _("grouping operations are not allowed in partition key expressions"); -
556 - -
557 - break; -
558 - case EXPR_KIND_GENERATED_COLUMN: -
559 - -
560 - if (isAgg) -
561 - err = _("aggregate functions are not allowed in column generation expressions"); -
562 - else -
563 - err = _("grouping operations are not allowed in column generation expressions"); -
564 - -
565 - break; -
566 - -
567 - case EXPR_KIND_CALL_ARGUMENT: -
568 - if (isAgg) -
569 - err = _("aggregate functions are not allowed in CALL arguments"); -
570 - else -
571 - err = _("grouping operations are not allowed in CALL arguments"); -
572 - -
573 - break; -
574 - -
575 - case EXPR_KIND_COPY_WHERE: -
576 - if (isAgg) -
577 - err = _("aggregate functions are not allowed in COPY FROM WHERE conditions"); -
578 - else -
579 - err = _("grouping operations are not allowed in COPY FROM WHERE conditions"); -
580 - -
581 - break; -
582 - -
583 - case EXPR_KIND_CYCLE_MARK: -
584 - errkind = true; -
585 - break; -
586 - -
587 - case EXPR_KIND_RPR_DEFINE: b8a35c3Row pattern recognition patch (parse/analysis).
588 - errkind = true; b8a35c3Row pattern recognition patch (parse/analysis).
589 - break; b8a35c3Row pattern recognition patch (parse/analysis).
590 - b8a35c3Row pattern recognition patch (parse/analysis).
591 - /* -
592 - * There is intentionally no default: case here, so that the -
593 - * compiler will warn if we add a new ParseExprKind without -
594 - * extending this switch. If we do see an unrecognized value at -
595 - * runtime, the behavior will be the same as for EXPR_KIND_OTHER, -
596 - * which is sane anyway. -
597 - */ -
598 - } -
599 - -
600 - if (err) -
601 - ereport(ERROR, -
602 - (errcode(ERRCODE_GROUPING_ERROR), -
603 - errmsg_internal("%s", err), -
604 - parser_errposition(pstate, location))); -
605 - -
606 - if (errkind) -
607 - { -
608 - if (isAgg) -
609 - /* translator: %s is name of a SQL construct, eg GROUP BY */ -
610 - err = _("aggregate functions are not allowed in %s"); -
611 - else -
612 - /* translator: %s is name of a SQL construct, eg GROUP BY */ -
613 - err = _("grouping operations are not allowed in %s"); -
614 - -
615 - ereport(ERROR, -
616 - (errcode(ERRCODE_GROUPING_ERROR), -
617 - errmsg_internal(err, -
618 - ParseExprKindName(pstate->p_expr_kind)), -
619 - parser_errposition(pstate, location))); -
620 - } -
621 - } -
transformWindowFuncCall() lines 882-1128
Modified Lines Coverage: 0/0 lines (0.0%)
LineHitsSourceCommit
882 - transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc, -
883 - WindowDef *windef) -
884 - { -
885 - const char *err; -
886 - bool errkind; -
887 - -
888 - /* -
889 - * A window function call can't contain another one (but aggs are OK). XXX -
890 - * is this required by spec, or just an unimplemented feature? -
891 - * -
892 - * Note: we don't need to check the filter expression here, because the -
893 - * context checks done below and in transformAggregateCall would have -
894 - * already rejected any window funcs or aggs within the filter. -
895 - */ -
896 - if (pstate->p_hasWindowFuncs && -
897 - contain_windowfuncs((Node *) wfunc->args)) -
898 - ereport(ERROR, -
899 - (errcode(ERRCODE_WINDOWING_ERROR), -
900 - errmsg("window function calls cannot be nested"), -
901 - parser_errposition(pstate, -
902 - locate_windowfunc((Node *) wfunc->args)))); -
903 - -
904 - /* -
905 - * Check to see if the window function is in an invalid place within the -
906 - * query. -
907 - * -
908 - * For brevity we support two schemes for reporting an error here: set -
909 - * "err" to a custom message, or set "errkind" true if the error context -
910 - * is sufficiently identified by what ParseExprKindName will return, *and* -
911 - * what it will return is just a SQL keyword. (Otherwise, use a custom -
912 - * message to avoid creating translation problems.) -
913 - */ -
914 - err = NULL; -
915 - errkind = false; -
916 - switch (pstate->p_expr_kind) -
917 - { -
918 - case EXPR_KIND_NONE: -
919 - Assert(false); /* can't happen */ -
920 - break; -
921 - case EXPR_KIND_OTHER: -
922 - /* Accept window func here; caller must throw error if wanted */ -
923 - break; -
924 - case EXPR_KIND_JOIN_ON: -
925 - case EXPR_KIND_JOIN_USING: -
926 - err = _("window functions are not allowed in JOIN conditions"); -
927 - break; -
928 - case EXPR_KIND_FROM_SUBSELECT: -
929 - /* can't get here, but just in case, throw an error */ -
930 - errkind = true; -
931 - break; -
932 - case EXPR_KIND_FROM_FUNCTION: -
933 - err = _("window functions are not allowed in functions in FROM"); -
934 - break; -
935 - case EXPR_KIND_WHERE: -
936 - errkind = true; -
937 - break; -
938 - case EXPR_KIND_POLICY: -
939 - err = _("window functions are not allowed in policy expressions"); -
940 - break; -
941 - case EXPR_KIND_HAVING: -
942 - errkind = true; -
943 - break; -
944 - case EXPR_KIND_FILTER: -
945 - errkind = true; -
946 - break; -
947 - case EXPR_KIND_WINDOW_PARTITION: -
948 - case EXPR_KIND_WINDOW_ORDER: -
949 - case EXPR_KIND_WINDOW_FRAME_RANGE: -
950 - case EXPR_KIND_WINDOW_FRAME_ROWS: -
951 - case EXPR_KIND_WINDOW_FRAME_GROUPS: -
952 - err = _("window functions are not allowed in window definitions"); -
953 - break; -
954 - case EXPR_KIND_SELECT_TARGET: -
955 - /* okay */ -
956 - break; -
957 - case EXPR_KIND_INSERT_TARGET: -
958 - case EXPR_KIND_UPDATE_SOURCE: -
959 - case EXPR_KIND_UPDATE_TARGET: -
960 - errkind = true; -
961 - break; -
962 - case EXPR_KIND_MERGE_WHEN: -
963 - err = _("window functions are not allowed in MERGE WHEN conditions"); -
964 - break; -
965 - case EXPR_KIND_GROUP_BY: -
966 - errkind = true; -
967 - break; -
968 - case EXPR_KIND_ORDER_BY: -
969 - /* okay */ -
970 - break; -
971 - case EXPR_KIND_DISTINCT_ON: -
972 - /* okay */ -
973 - break; -
974 - case EXPR_KIND_LIMIT: -
975 - case EXPR_KIND_OFFSET: -
976 - errkind = true; -
977 - break; -
978 - case EXPR_KIND_RETURNING: -
979 - case EXPR_KIND_MERGE_RETURNING: -
980 - errkind = true; -
981 - break; -
982 - case EXPR_KIND_VALUES: -
983 - case EXPR_KIND_VALUES_SINGLE: -
984 - errkind = true; -
985 - break; -
986 - case EXPR_KIND_CHECK_CONSTRAINT: -
987 - case EXPR_KIND_DOMAIN_CHECK: -
988 - err = _("window functions are not allowed in check constraints"); -
989 - break; -
990 - case EXPR_KIND_COLUMN_DEFAULT: -
991 - case EXPR_KIND_FUNCTION_DEFAULT: -
992 - err = _("window functions are not allowed in DEFAULT expressions"); -
993 - break; -
994 - case EXPR_KIND_INDEX_EXPRESSION: -
995 - err = _("window functions are not allowed in index expressions"); -
996 - break; -
997 - case EXPR_KIND_STATS_EXPRESSION: -
998 - err = _("window functions are not allowed in statistics expressions"); -
999 - break; -
1000 - case EXPR_KIND_INDEX_PREDICATE: -
1001 - err = _("window functions are not allowed in index predicates"); -
1002 - break; -
1003 - case EXPR_KIND_ALTER_COL_TRANSFORM: -
1004 - err = _("window functions are not allowed in transform expressions"); -
1005 - break; -
1006 - case EXPR_KIND_EXECUTE_PARAMETER: -
1007 - err = _("window functions are not allowed in EXECUTE parameters"); -
1008 - break; -
1009 - case EXPR_KIND_TRIGGER_WHEN: -
1010 - err = _("window functions are not allowed in trigger WHEN conditions"); -
1011 - break; -
1012 - case EXPR_KIND_PARTITION_BOUND: -
1013 - err = _("window functions are not allowed in partition bound"); -
1014 - break; -
1015 - case EXPR_KIND_PARTITION_EXPRESSION: -
1016 - err = _("window functions are not allowed in partition key expressions"); -
1017 - break; -
1018 - case EXPR_KIND_CALL_ARGUMENT: -
1019 - err = _("window functions are not allowed in CALL arguments"); -
1020 - break; -
1021 - case EXPR_KIND_COPY_WHERE: -
1022 - err = _("window functions are not allowed in COPY FROM WHERE conditions"); -
1023 - break; -
1024 - case EXPR_KIND_GENERATED_COLUMN: -
1025 - err = _("window functions are not allowed in column generation expressions"); -
1026 - break; -
1027 - case EXPR_KIND_CYCLE_MARK: -
1028 - errkind = true; -
1029 - break; -
1030 - case EXPR_KIND_RPR_DEFINE: b8a35c3Row pattern recognition patch (parse/analysis).
1031 - errkind = true; b8a35c3Row pattern recognition patch (parse/analysis).
1032 - break; b8a35c3Row pattern recognition patch (parse/analysis).
1033 - -
1034 - /* -
1035 - * There is intentionally no default: case here, so that the -
1036 - * compiler will warn if we add a new ParseExprKind without -
1037 - * extending this switch. If we do see an unrecognized value at -
1038 - * runtime, the behavior will be the same as for EXPR_KIND_OTHER, -
1039 - * which is sane anyway. -
1040 - */ -
1041 - } -
1042 - if (err) -
1043 - ereport(ERROR, -
1044 - (errcode(ERRCODE_WINDOWING_ERROR), -
1045 - errmsg_internal("%s", err), -
1046 - parser_errposition(pstate, wfunc->location))); -
1047 - if (errkind) -
1048 - ereport(ERROR, -
1049 - (errcode(ERRCODE_WINDOWING_ERROR), -
1050 - /* translator: %s is name of a SQL construct, eg GROUP BY */ -
1051 - errmsg("window functions are not allowed in %s", -
1052 - ParseExprKindName(pstate->p_expr_kind)), -
1053 - parser_errposition(pstate, wfunc->location))); -
1054 - -
1055 - /* -
1056 - * If the OVER clause just specifies a window name, find that WINDOW -
1057 - * clause (which had better be present). Otherwise, try to match all the -
1058 - * properties of the OVER clause, and make a new entry in the p_windowdefs -
1059 - * list if no luck. -
1060 - */ -
1061 - if (windef->name) -
1062 - { -
1063 - Index winref = 0; -
1064 - ListCell *lc; -
1065 - -
1066 - Assert(windef->refname == NULL && -
1067 - windef->partitionClause == NIL && -
1068 - windef->orderClause == NIL && -
1069 - windef->frameOptions == FRAMEOPTION_DEFAULTS); -
1070 - -
1071 - foreach(lc, pstate->p_windowdefs) -
1072 - { -
1073 - WindowDef *refwin = (WindowDef *) lfirst(lc); -
1074 - -
1075 - winref++; -
1076 - if (refwin->name && strcmp(refwin->name, windef->name) == 0) -
1077 - { -
1078 - wfunc->winref = winref; -
1079 - break; -
1080 - } -
1081 - } -
1082 - if (lc == NULL) /* didn't find it? */ -
1083 - ereport(ERROR, -
1084 - (errcode(ERRCODE_UNDEFINED_OBJECT), -
1085 - errmsg("window \"%s\" does not exist", windef->name), -
1086 - parser_errposition(pstate, windef->location))); -
1087 - } -
1088 - else -
1089 - { -
1090 - Index winref = 0; -
1091 - ListCell *lc; -
1092 - -
1093 - foreach(lc, pstate->p_windowdefs) -
1094 - { -
1095 - WindowDef *refwin = (WindowDef *) lfirst(lc); -
1096 - -
1097 - winref++; -
1098 - if (refwin->refname && windef->refname && -
1099 - strcmp(refwin->refname, windef->refname) == 0) -
1100 - /* matched on refname */ ; -
1101 - else if (!refwin->refname && !windef->refname) -
1102 - /* matched, no refname */ ; -
1103 - else -
1104 - continue; -
1105 - -
1106 - /* -
1107 - * Also see similar de-duplication code in optimize_window_clauses -
1108 - */ -
1109 - if (equal(refwin->partitionClause, windef->partitionClause) && -
1110 - equal(refwin->orderClause, windef->orderClause) && -
1111 - refwin->frameOptions == windef->frameOptions && -
1112 - equal(refwin->startOffset, windef->startOffset) && -
1113 - equal(refwin->endOffset, windef->endOffset)) -
1114 - { -
1115 - /* found a duplicate window specification */ -
1116 - wfunc->winref = winref; -
1117 - break; -
1118 - } -
1119 - } -
1120 - if (lc == NULL) /* didn't find it? */ -
1121 - { -
1122 - pstate->p_windowdefs = lappend(pstate->p_windowdefs, windef); -
1123 - wfunc->winref = list_length(pstate->p_windowdefs); -
1124 - } -
1125 - } -
1126 - -
1127 - pstate->p_hasWindowFuncs = true; -
1128 - } -