← Back to Overview

src/backend/parser/parse_func.c

Coverage: 0/3 lines (0.0%)
Total Lines
3
modified
Covered
0
0.0%
Uncovered
3
100.0%
키보드 네비게이션
check_srf_call_placement() lines 2636-2810
Modified Lines Coverage: 0/3 lines (0.0%)
LineHitsSourceCommit
2636 - check_srf_call_placement(ParseState *pstate, Node *last_srf, int location) -
2637 - { -
2638 - const char *err; -
2639 - bool errkind; -
2640 - -
2641 - /* -
2642 - * Check to see if the set-returning function is in an invalid place -
2643 - * within the query. Basically, we don't allow SRFs anywhere except in -
2644 - * the targetlist (which includes GROUP BY/ORDER BY expressions), VALUES, -
2645 - * and functions in FROM. -
2646 - * -
2647 - * For brevity we support two schemes for reporting an error here: set -
2648 - * "err" to a custom message, or set "errkind" true if the error context -
2649 - * is sufficiently identified by what ParseExprKindName will return, *and* -
2650 - * what it will return is just a SQL keyword. (Otherwise, use a custom -
2651 - * message to avoid creating translation problems.) -
2652 - */ -
2653 - err = NULL; -
2654 - errkind = false; -
2655 - switch (pstate->p_expr_kind) -
2656 - { -
2657 - case EXPR_KIND_NONE: -
2658 - Assert(false); /* can't happen */ -
2659 - break; -
2660 - case EXPR_KIND_OTHER: -
2661 - /* Accept SRF here; caller must throw error if wanted */ -
2662 - break; -
2663 - case EXPR_KIND_JOIN_ON: -
2664 - case EXPR_KIND_JOIN_USING: -
2665 - err = _("set-returning functions are not allowed in JOIN conditions"); -
2666 - break; -
2667 - case EXPR_KIND_FROM_SUBSELECT: -
2668 - /* can't get here, but just in case, throw an error */ -
2669 - errkind = true; -
2670 - break; -
2671 - case EXPR_KIND_FROM_FUNCTION: -
2672 - /* okay, but we don't allow nested SRFs here */ -
2673 - /* errmsg is chosen to match transformRangeFunction() */ -
2674 - /* errposition should point to the inner SRF */ -
2675 - if (pstate->p_last_srf != last_srf) -
2676 - ereport(ERROR, -
2677 - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), -
2678 - errmsg("set-returning functions must appear at top level of FROM"), -
2679 - parser_errposition(pstate, -
2680 - exprLocation(pstate->p_last_srf)))); -
2681 - break; -
2682 - case EXPR_KIND_WHERE: -
2683 - errkind = true; -
2684 - break; -
2685 - case EXPR_KIND_POLICY: -
2686 - err = _("set-returning functions are not allowed in policy expressions"); -
2687 - break; -
2688 - case EXPR_KIND_HAVING: -
2689 - errkind = true; -
2690 - break; -
2691 - case EXPR_KIND_FILTER: -
2692 - errkind = true; -
2693 - break; -
2694 - case EXPR_KIND_WINDOW_PARTITION: -
2695 - case EXPR_KIND_WINDOW_ORDER: -
2696 - /* okay, these are effectively GROUP BY/ORDER BY */ -
2697 - pstate->p_hasTargetSRFs = true; -
2698 - break; -
2699 - case EXPR_KIND_WINDOW_FRAME_RANGE: -
2700 - case EXPR_KIND_WINDOW_FRAME_ROWS: -
2701 - case EXPR_KIND_WINDOW_FRAME_GROUPS: -
2702 - err = _("set-returning functions are not allowed in window definitions"); -
2703 - break; -
2704 - case EXPR_KIND_SELECT_TARGET: -
2705 - case EXPR_KIND_INSERT_TARGET: -
2706 - /* okay */ -
2707 - pstate->p_hasTargetSRFs = true; -
2708 - break; -
2709 - case EXPR_KIND_UPDATE_SOURCE: -
2710 - case EXPR_KIND_UPDATE_TARGET: -
2711 - /* disallowed because it would be ambiguous what to do */ -
2712 - errkind = true; -
2713 - break; -
2714 - case EXPR_KIND_GROUP_BY: -
2715 - case EXPR_KIND_ORDER_BY: -
2716 - /* okay */ -
2717 - pstate->p_hasTargetSRFs = true; -
2718 - break; -
2719 - case EXPR_KIND_DISTINCT_ON: -
2720 - /* okay */ -
2721 - pstate->p_hasTargetSRFs = true; -
2722 - break; -
2723 - case EXPR_KIND_LIMIT: -
2724 - case EXPR_KIND_OFFSET: -
2725 - errkind = true; -
2726 - break; -
2727 - case EXPR_KIND_RETURNING: -
2728 - case EXPR_KIND_MERGE_RETURNING: -
2729 - errkind = true; -
2730 - break; -
2731 - case EXPR_KIND_VALUES: -
2732 - /* SRFs are presently not supported by nodeValuesscan.c */ -
2733 - errkind = true; -
2734 - break; -
2735 - case EXPR_KIND_VALUES_SINGLE: -
2736 - /* okay, since we process this like a SELECT tlist */ -
2737 - pstate->p_hasTargetSRFs = true; -
2738 - break; -
2739 - case EXPR_KIND_MERGE_WHEN: -
2740 - err = _("set-returning functions are not allowed in MERGE WHEN conditions"); -
2741 - break; -
2742 - case EXPR_KIND_CHECK_CONSTRAINT: -
2743 - case EXPR_KIND_DOMAIN_CHECK: -
2744 - err = _("set-returning functions are not allowed in check constraints"); -
2745 - break; -
2746 - case EXPR_KIND_COLUMN_DEFAULT: -
2747 - case EXPR_KIND_FUNCTION_DEFAULT: -
2748 - err = _("set-returning functions are not allowed in DEFAULT expressions"); -
2749 - break; -
2750 - case EXPR_KIND_INDEX_EXPRESSION: -
2751 - err = _("set-returning functions are not allowed in index expressions"); -
2752 - break; -
2753 - case EXPR_KIND_INDEX_PREDICATE: -
2754 - err = _("set-returning functions are not allowed in index predicates"); -
2755 - break; -
2756 - case EXPR_KIND_STATS_EXPRESSION: -
2757 - err = _("set-returning functions are not allowed in statistics expressions"); -
2758 - break; -
2759 - case EXPR_KIND_ALTER_COL_TRANSFORM: -
2760 - err = _("set-returning functions are not allowed in transform expressions"); -
2761 - break; -
2762 - case EXPR_KIND_EXECUTE_PARAMETER: -
2763 - err = _("set-returning functions are not allowed in EXECUTE parameters"); -
2764 - break; -
2765 - case EXPR_KIND_TRIGGER_WHEN: -
2766 - err = _("set-returning functions are not allowed in trigger WHEN conditions"); -
2767 - break; -
2768 - case EXPR_KIND_PARTITION_BOUND: -
2769 - err = _("set-returning functions are not allowed in partition bound"); -
2770 - break; -
2771 - case EXPR_KIND_PARTITION_EXPRESSION: -
2772 - err = _("set-returning functions are not allowed in partition key expressions"); -
2773 - break; -
2774 - case EXPR_KIND_CALL_ARGUMENT: -
2775 - err = _("set-returning functions are not allowed in CALL arguments"); -
2776 - break; -
2777 - case EXPR_KIND_COPY_WHERE: -
2778 - err = _("set-returning functions are not allowed in COPY FROM WHERE conditions"); -
2779 - break; -
2780 - case EXPR_KIND_GENERATED_COLUMN: -
2781 - err = _("set-returning functions are not allowed in column generation expressions"); -
2782 - break; -
2783 - case EXPR_KIND_CYCLE_MARK: -
2784 - errkind = true; -
2785 - break; -
2786 0 case EXPR_KIND_PROPGRAPH_PROPERTY: 86c14eaWIP: SQL Property Graph Queries (SQL/PGQ)
2787 0 err = _("set-returning functions are not allowed in property definition expressions"); 86c14eaWIP: SQL Property Graph Queries (SQL/PGQ)
2788 0 break; 86c14eaWIP: SQL Property Graph Queries (SQL/PGQ)
2789 - -
2790 - /* -
2791 - * There is intentionally no default: case here, so that the -
2792 - * compiler will warn if we add a new ParseExprKind without -
2793 - * extending this switch. If we do see an unrecognized value at -
2794 - * runtime, the behavior will be the same as for EXPR_KIND_OTHER, -
2795 - * which is sane anyway. -
2796 - */ -
2797 - } -
2798 - if (err) -
2799 - ereport(ERROR, -
2800 - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), -
2801 - errmsg_internal("%s", err), -
2802 - parser_errposition(pstate, location))); -
2803 - if (errkind) -
2804 - ereport(ERROR, -
2805 - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), -
2806 - /* translator: %s is name of a SQL construct, eg GROUP BY */ -
2807 - errmsg("set-returning functions are not allowed in %s", -
2808 - ParseExprKindName(pstate->p_expr_kind)), -
2809 - parser_errposition(pstate, location))); -
2810 - } -