| Line | Hits | Source | Commit |
| 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 |
- |
} |
- |