diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-03-11 06:19:00 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-03-11 06:19:00 +0000 |
commit | 73f5b0847b1edd93efdab9a8aad4499ae37d3cc5 (patch) | |
tree | d8aff20f042e576cf6d7faa3cd18e87ed85b30dc | |
parent | f3a9d75ebd731a4b7ae313ac9e8e0575e2cc0e38 (diff) | |
download | postgresql-73f5b0847b1edd93efdab9a8aad4499ae37d3cc5.tar.gz postgresql-73f5b0847b1edd93efdab9a8aad4499ae37d3cc5.zip |
exec_simple_check_plan() must not allow a plan having initPlans or
subPlans to be considered 'simple'. This fixes reported problem with
'return exists (select 1 from foo);' in plpgsql function.
-rw-r--r-- | src/pl/plpgsql/src/pl_exec.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index d58c9893f71..dfb4d252306 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -3,7 +3,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.18 2000/02/07 03:39:13 inoue Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.19 2000/03/11 06:19:00 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -2510,30 +2510,35 @@ exec_simple_check_plan(PLpgSQL_expr * expr) if (plan == NULL) /* utility statement produces this */ return; - if (nodeTag(plan) != T_Result) + if (! IsA(plan, Result)) return; /* ---------- - * 3. The plan must have a single attribute as result + * 3. Can't have any subplan or qual clause, either * ---------- */ - if (length(plan->targetlist) != 1) + if (plan->lefttree != NULL || + plan->righttree != NULL || + plan->initPlan != NULL || + plan->subPlan != NULL || + plan->qual != NULL || + ((Result *) plan)->resconstantqual != NULL) return; /* ---------- - * 4. Don't know if all these can break us, so let SPI handle - * those plans + * 4. The plan must have a single attribute as result * ---------- */ - if (plan->qual != NULL || plan->lefttree != NULL || plan->righttree != NULL) + if (length(plan->targetlist) != 1) return; + tle = (TargetEntry *) lfirst(plan->targetlist); + /* ---------- * 5. Check that all the nodes in the expression are one of * Expr, Param or Const. * ---------- */ - tle = (TargetEntry *) lfirst(plan->targetlist); if (!exec_simple_check_node(tle->expr)) return; @@ -2563,8 +2568,6 @@ exec_simple_check_plan(PLpgSQL_expr * expr) default: expr->plan_simple_type = InvalidOid; } - - return; } |