Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 58e2f36

Browse files
author
Nikita Glukhov
committed
fixup! Add subtransactions for JsonExpr execution
1 parent 6bfeaf4 commit 58e2f36

File tree

2 files changed

+104
-103
lines changed

2 files changed

+104
-103
lines changed

src/backend/executor/execExpr.c

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#include "access/nbtree.h"
3434
#include "catalog/objectaccess.h"
35+
#include "catalog/pg_proc.h"
3536
#include "catalog/pg_type.h"
3637
#include "executor/execExpr.h"
3738
#include "executor/nodeSubplan.h"
@@ -73,6 +74,7 @@ static bool isAssignmentIndirectionExpr(Expr *expr);
7374
static void ExecInitCoerceToDomain(ExprEvalStep *scratch, CoerceToDomain *ctest,
7475
PlanState *parent, ExprState *state,
7576
Datum *resv, bool *resnull);
77+
static char getJsonExprVolatility(JsonExpr *jsexpr);
7678

7779

7880
/*
@@ -2800,3 +2802,105 @@ ExecInitCoerceToDomain(ExprEvalStep *scratch, CoerceToDomain *ctest,
28002802
}
28012803
}
28022804
}
2805+
2806+
2807+
static char
2808+
getExprVolatility(Node *expr)
2809+
{
2810+
if (contain_volatile_functions(expr))
2811+
return PROVOLATILE_VOLATILE;
2812+
2813+
if (contain_mutable_functions(expr))
2814+
return PROVOLATILE_STABLE;
2815+
2816+
return PROVOLATILE_IMMUTABLE;
2817+
}
2818+
2819+
static char
2820+
getJsonCoercionVolatility(JsonCoercion *coercion, JsonReturning *returning)
2821+
{
2822+
if (!coercion)
2823+
return PROVOLATILE_IMMUTABLE;
2824+
2825+
if (coercion->expr)
2826+
return getExprVolatility(coercion->expr);
2827+
2828+
if (coercion->via_io)
2829+
{
2830+
Oid typinput;
2831+
Oid typioparam;
2832+
2833+
getTypeInputInfo(returning->typid, &typinput, &typioparam);
2834+
2835+
return func_volatile(typinput);
2836+
}
2837+
2838+
if (coercion->via_populate)
2839+
return PROVOLATILE_STABLE;
2840+
2841+
return PROVOLATILE_IMMUTABLE;
2842+
}
2843+
2844+
static char
2845+
getJsonExprVolatility(JsonExpr *jsexpr)
2846+
{
2847+
char volatility;
2848+
char volatility2;
2849+
ListCell *lc;
2850+
2851+
volatility = getExprVolatility(jsexpr->formatted_expr);
2852+
2853+
if (volatility == PROVOLATILE_VOLATILE)
2854+
return PROVOLATILE_VOLATILE;
2855+
2856+
volatility2 = getJsonCoercionVolatility(jsexpr->result_coercion,
2857+
&jsexpr->returning);
2858+
2859+
if (volatility2 == PROVOLATILE_VOLATILE)
2860+
return PROVOLATILE_VOLATILE;
2861+
2862+
if (volatility2 == PROVOLATILE_STABLE)
2863+
volatility = PROVOLATILE_STABLE;
2864+
2865+
if (jsexpr->coercions)
2866+
{
2867+
JsonCoercion **coercion;
2868+
2869+
for (coercion = &jsexpr->coercions->null;
2870+
coercion <= &jsexpr->coercions->composite;
2871+
coercion++)
2872+
{
2873+
volatility2 = getJsonCoercionVolatility(*coercion, &jsexpr->returning);
2874+
2875+
if (volatility2 == PROVOLATILE_VOLATILE)
2876+
return PROVOLATILE_VOLATILE;
2877+
2878+
if (volatility2 == PROVOLATILE_STABLE)
2879+
volatility = PROVOLATILE_STABLE;
2880+
}
2881+
}
2882+
2883+
if (jsexpr->on_empty.btype == JSON_BEHAVIOR_DEFAULT)
2884+
{
2885+
volatility2 = getExprVolatility(jsexpr->on_empty.default_expr);
2886+
2887+
if (volatility2 == PROVOLATILE_VOLATILE)
2888+
return PROVOLATILE_VOLATILE;
2889+
2890+
if (volatility2 == PROVOLATILE_STABLE)
2891+
volatility = PROVOLATILE_STABLE;
2892+
}
2893+
2894+
foreach(lc, jsexpr->passing.values)
2895+
{
2896+
volatility2 = getExprVolatility(lfirst(lc));
2897+
2898+
if (volatility2 == PROVOLATILE_VOLATILE)
2899+
return PROVOLATILE_VOLATILE;
2900+
2901+
if (volatility2 == PROVOLATILE_STABLE)
2902+
volatility = PROVOLATILE_STABLE;
2903+
}
2904+
2905+
return volatility;
2906+
}

src/backend/parser/parse_expr.c

Lines changed: 0 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include "miscadmin.h"
2323
#include "nodes/makefuncs.h"
2424
#include "nodes/nodeFuncs.h"
25-
#include "optimizer/clauses.h"
2625
#include "optimizer/tlist.h"
2726
#include "optimizer/var.h"
2827
#include "parser/analyze.h"
@@ -4718,105 +4717,3 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
47184717

47194718
return (Node *) jsexpr;
47204719
}
4721-
4722-
static char
4723-
getExprVolatility(Node *expr)
4724-
{
4725-
if (contain_volatile_functions(expr))
4726-
return PROVOLATILE_VOLATILE;
4727-
4728-
if (contain_mutable_functions(expr))
4729-
return PROVOLATILE_STABLE;
4730-
4731-
return PROVOLATILE_IMMUTABLE;
4732-
}
4733-
4734-
static char
4735-
getJsonCoercionVolatility(JsonCoercion *coercion, JsonReturning *returning)
4736-
{
4737-
if (!coercion)
4738-
return PROVOLATILE_IMMUTABLE;
4739-
4740-
if (coercion->expr)
4741-
return getExprVolatility(coercion->expr);
4742-
4743-
if (coercion->via_io)
4744-
{
4745-
Oid typinput;
4746-
Oid typioparam;
4747-
4748-
getTypeInputInfo(returning->typid, &typinput, &typioparam);
4749-
4750-
return func_volatile(typinput);
4751-
}
4752-
4753-
if (coercion->via_populate)
4754-
return PROVOLATILE_STABLE;
4755-
4756-
return PROVOLATILE_IMMUTABLE;
4757-
}
4758-
4759-
char
4760-
getJsonExprVolatility(JsonExpr *jsexpr)
4761-
{
4762-
char volatility;
4763-
char volatility2;
4764-
ListCell *lc;
4765-
4766-
volatility = getExprVolatility(jsexpr->formatted_expr);
4767-
4768-
if (volatility == PROVOLATILE_VOLATILE)
4769-
return PROVOLATILE_VOLATILE;
4770-
4771-
volatility2 = getJsonCoercionVolatility(jsexpr->result_coercion,
4772-
&jsexpr->returning);
4773-
4774-
if (volatility2 == PROVOLATILE_VOLATILE)
4775-
return PROVOLATILE_VOLATILE;
4776-
4777-
if (volatility2 == PROVOLATILE_STABLE)
4778-
volatility = PROVOLATILE_STABLE;
4779-
4780-
if (jsexpr->coercions)
4781-
{
4782-
JsonCoercion **coercion;
4783-
4784-
for (coercion = &jsexpr->coercions->null;
4785-
coercion <= &jsexpr->coercions->composite;
4786-
coercion++)
4787-
{
4788-
volatility2 = getJsonCoercionVolatility(*coercion, &jsexpr->returning);
4789-
4790-
if (volatility2 == PROVOLATILE_VOLATILE)
4791-
return PROVOLATILE_VOLATILE;
4792-
4793-
if (volatility2 == PROVOLATILE_STABLE)
4794-
volatility = PROVOLATILE_STABLE;
4795-
}
4796-
}
4797-
4798-
if (jsexpr->on_empty.btype == JSON_BEHAVIOR_DEFAULT)
4799-
{
4800-
volatility2 = getExprVolatility(jsexpr->on_empty.default_expr);
4801-
4802-
if (volatility2 == PROVOLATILE_VOLATILE)
4803-
return PROVOLATILE_VOLATILE;
4804-
4805-
if (volatility2 == PROVOLATILE_STABLE)
4806-
volatility = PROVOLATILE_STABLE;
4807-
}
4808-
4809-
foreach(lc, jsexpr->passing.values)
4810-
{
4811-
volatility2 = getExprVolatility(lfirst(lc));
4812-
4813-
if (volatility2 == PROVOLATILE_VOLATILE)
4814-
return PROVOLATILE_VOLATILE;
4815-
4816-
if (volatility2 == PROVOLATILE_STABLE)
4817-
volatility = PROVOLATILE_STABLE;
4818-
}
4819-
4820-
return volatility;
4821-
}
4822-

0 commit comments

Comments
 (0)