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

Commit 7d36238

Browse files
committed
Add support of division by modulo operator
1 parent 556b282 commit 7d36238

File tree

3 files changed

+105
-54
lines changed

3 files changed

+105
-54
lines changed

vops--1.0.sql

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,13 @@ create operator / (leftarg=vops_char, rightarg=vops_char, procedure=vops_char_di
160160
create operator / (leftarg=vops_char, rightarg="char", procedure=vops_char_div_rconst);
161161
create operator / (leftarg="char", rightarg=vops_char, procedure=vops_char_div_lconst);
162162

163+
create function vops_char_rem(left vops_char, right vops_char) returns vops_char as 'MODULE_PATHNAME' language C parallel safe immutable strict;
164+
create function vops_char_rem_rconst(left vops_char, right "char") returns vops_char as 'MODULE_PATHNAME' language C parallel safe immutable strict;
165+
create function vops_char_rem_lconst(left "char", right vops_char) returns vops_char as 'MODULE_PATHNAME' language C parallel safe immutable strict;
166+
create operator % (leftarg=vops_char, rightarg=vops_char, procedure=vops_char_rem);
167+
create operator % (leftarg=vops_char, rightarg="char", procedure=vops_char_rem_rconst);
168+
create operator % (leftarg="char", rightarg=vops_char, procedure=vops_char_rem_lconst);
169+
163170
create function vops_char_eq(left vops_char, right vops_char) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
164171
create function vops_char_eq_rconst(left vops_char, right "char") returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
165172
create function vops_char_eq_lconst(left "char", right vops_char) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
@@ -486,6 +493,13 @@ create operator / (leftarg=vops_int2, rightarg=vops_int2, procedure=vops_int2_di
486493
create operator / (leftarg=vops_int2, rightarg=int4, procedure=vops_int2_div_rconst);
487494
create operator / (leftarg=int4, rightarg=vops_int2, procedure=vops_int2_div_lconst);
488495

496+
create function vops_int2_rem(left vops_int2, right vops_int2) returns vops_int2 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
497+
create function vops_int2_rem_rconst(left vops_int2, right int4) returns vops_int2 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
498+
create function vops_int2_rem_lconst(left int4, right vops_int2) returns vops_int2 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
499+
create operator % (leftarg=vops_int2, rightarg=vops_int2, procedure=vops_int2_rem);
500+
create operator % (leftarg=vops_int2, rightarg=int4, procedure=vops_int2_rem_rconst);
501+
create operator % (leftarg=int4, rightarg=vops_int2, procedure=vops_int2_rem_lconst);
502+
489503
create function vops_int2_eq(left vops_int2, right vops_int2) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
490504
create function vops_int2_eq_rconst(left vops_int2, right int4) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
491505
create function vops_int2_eq_lconst(left int4, right vops_int2) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
@@ -798,6 +812,13 @@ create operator / (leftarg=vops_int4, rightarg=vops_int4, procedure=vops_int4_di
798812
create operator / (leftarg=vops_int4, rightarg=int4, procedure=vops_int4_div_rconst);
799813
create operator / (leftarg=int4, rightarg=vops_int4, procedure=vops_int4_div_lconst);
800814

815+
create function vops_int4_rem(left vops_int4, right vops_int4) returns vops_int4 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
816+
create function vops_int4_rem_rconst(left vops_int4, right int4) returns vops_int4 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
817+
create function vops_int4_rem_lconst(left int4, right vops_int4) returns vops_int4 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
818+
create operator % (leftarg=vops_int4, rightarg=vops_int4, procedure=vops_int4_rem);
819+
create operator % (leftarg=vops_int4, rightarg=int4, procedure=vops_int4_rem_rconst);
820+
create operator % (leftarg=int4, rightarg=vops_int4, procedure=vops_int4_rem_lconst);
821+
801822
create function vops_int4_eq(left vops_int4, right vops_int4) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
802823
create function vops_int4_eq_rconst(left vops_int4, right int4) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
803824
create function vops_int4_eq_lconst(left int4, right vops_int4) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
@@ -1100,12 +1121,15 @@ create operator * (leftarg=vops_date, rightarg=vops_date, procedure=vops_date_mu
11001121
create operator * (leftarg=vops_date, rightarg=date, procedure=vops_date_mul_rconst, commutator= *);
11011122
create operator * (leftarg=date, rightarg=vops_date, procedure=vops_date_mul_lconst, commutator= *);
11021123

1103-
create function vops_date_div(left vops_date, right vops_date) returns vops_date as 'MODULE_PATHNAME','vops_int4_div' language C parallel safe immutable strict;
1104-
create function vops_date_div_rconst(left vops_date, right date) returns vops_date as 'MODULE_PATHNAME','vops_int4_div_rconst' language C parallel safe immutable strict;
1105-
create function vops_date_div_lconst(left date, right vops_date) returns vops_date as 'MODULE_PATHNAME','vops_int4_div_lconst' language C parallel safe immutable strict;
1106-
create operator / (leftarg=vops_date, rightarg=vops_date, procedure=vops_date_div);
1107-
create operator / (leftarg=vops_date, rightarg=date, procedure=vops_date_div_rconst);
1108-
create operator / (leftarg=date, rightarg=vops_date, procedure=vops_date_div_lconst);
1124+
create function vops_date_div(left vops_date, right vops_int4) returns vops_int4 as 'MODULE_PATHNAME','vops_int4_div' language C parallel safe immutable strict;
1125+
create function vops_date_div_rconst(left vops_date, right int4) returns vops_int4 as 'MODULE_PATHNAME','vops_int4_div_rconst' language C parallel safe immutable strict;
1126+
create operator / (leftarg=vops_date, rightarg=vops_int4, procedure=vops_date_div);
1127+
create operator / (leftarg=vops_date, rightarg=int4, procedure=vops_date_div_rconst);
1128+
1129+
create function vops_date_rem(left vops_date, right vops_int4) returns vops_int4 as 'MODULE_PATHNAME','vops_int4_rem' language C parallel safe immutable strict;
1130+
create function vops_date_rem_rconst(left vops_date, right int4) returns vops_int4 as 'MODULE_PATHNAME','vops_int4_rem_rconst' language C parallel safe immutable strict;
1131+
create operator % (leftarg=vops_date, rightarg=vops_int4, procedure=vops_date_rem);
1132+
create operator % (leftarg=vops_date, rightarg=int4, procedure=vops_date_rem_rconst);
11091133

11101134
create function vops_date_eq(left vops_date, right vops_date) returns vops_bool as 'MODULE_PATHNAME','vops_int4_eq' language C parallel safe immutable strict;
11111135
create function vops_date_eq_rconst(left vops_date, right date) returns vops_bool as 'MODULE_PATHNAME','vops_int4_eq_rconst' language C parallel safe immutable strict;
@@ -1419,12 +1443,15 @@ create operator * (leftarg=vops_timestamp, rightarg=vops_timestamp, procedure=vo
14191443
create operator * (leftarg=vops_timestamp, rightarg=timestamp, procedure=vops_timestamp_mul_rconst, commutator= *);
14201444
create operator * (leftarg=timestamp, rightarg=vops_timestamp, procedure=vops_timestamp_mul_lconst, commutator= *);
14211445

1422-
create function vops_timestamp_div(left vops_timestamp, right vops_timestamp) returns vops_timestamp as 'MODULE_PATHNAME','vops_int8_div' language C parallel safe immutable strict;
1423-
create function vops_timestamp_div_rconst(left vops_timestamp, right timestamp) returns vops_timestamp as 'MODULE_PATHNAME','vops_int8_div_rconst' language C parallel safe immutable strict;
1424-
create function vops_timestamp_div_lconst(left timestamp, right vops_timestamp) returns vops_timestamp as 'MODULE_PATHNAME','vops_int8_div_lconst' language C parallel safe immutable strict;
1425-
create operator / (leftarg=vops_timestamp, rightarg=vops_timestamp, procedure=vops_timestamp_div);
1426-
create operator / (leftarg=vops_timestamp, rightarg=timestamp, procedure=vops_timestamp_div_rconst);
1427-
create operator / (leftarg=timestamp, rightarg=vops_timestamp, procedure=vops_timestamp_div_lconst);
1446+
create function vops_timestamp_div(left vops_timestamp, right vops_int8) returns vops_int8 as 'MODULE_PATHNAME','vops_int8_div' language C parallel safe immutable strict;
1447+
create function vops_timestamp_div_rconst(left vops_timestamp, right int8) returns vops_int8 as 'MODULE_PATHNAME','vops_int8_div_rconst' language C parallel safe immutable strict;
1448+
create operator / (leftarg=vops_timestamp, rightarg=vops_int8, procedure=vops_timestamp_div);
1449+
create operator / (leftarg=vops_timestamp, rightarg=int8, procedure=vops_timestamp_div_rconst);
1450+
1451+
create function vops_timestamp_rem(left vops_timestamp, right vops_int8) returns vops_int8 as 'MODULE_PATHNAME','vops_int8_rem' language C parallel safe immutable strict;
1452+
create function vops_timestamp_rem_rconst(left vops_timestamp, right int8) returns vops_int8 as 'MODULE_PATHNAME','vops_int8_rem_rconst' language C parallel safe immutable strict;
1453+
create operator % (leftarg=vops_timestamp, rightarg=vops_int8, procedure=vops_timestamp_rem);
1454+
create operator % (leftarg=vops_timestamp, rightarg=int8, procedure=vops_timestamp_rem_rconst);
14281455

14291456
create function vops_timestamp_eq(left vops_timestamp, right vops_timestamp) returns vops_bool as 'MODULE_PATHNAME','vops_int8_eq' language C parallel safe immutable strict;
14301457
create function vops_timestamp_eq_rconst(left vops_timestamp, right timestamp) returns vops_bool as 'MODULE_PATHNAME','vops_int8_eq_rconst' language C parallel safe immutable strict;
@@ -1743,6 +1770,17 @@ create operator / (leftarg=vops_interval, rightarg=int8, procedure=vops_interval
17431770
create operator / (leftarg=vops_interval, rightarg=interval, procedure=vops_interval_div_rconst);
17441771
create operator / (leftarg=interval, rightarg=vops_interval, procedure=vops_interval_div_lconst);
17451772

1773+
create function vops_interval_rem(left vops_interval, right vops_interval) returns vops_int8 as 'MODULE_PATHNAME','vops_int8_rem' language C parallel safe immutable strict;
1774+
create function vops_interval_int_rem(left vops_interval, right vops_int8) returns vops_interval as 'MODULE_PATHNAME','vops_int8_rem' language C parallel safe immutable strict;
1775+
create function vops_interval_rem_int_rconst(left vops_interval, right int8) returns vops_interval as 'MODULE_PATHNAME','vops_int8_rem_rconst' language C parallel safe immutable strict;
1776+
create function vops_interval_rem_rconst(left vops_interval, right interval) returns vops_int8 as 'MODULE_PATHNAME','vops_int8_rem_rconst' language C parallel safe immutable strict;
1777+
create function vops_interval_rem_lconst(left interval, right vops_interval) returns vops_int8 as 'MODULE_PATHNAME','vops_int8_rem_lconst' language C parallel safe immutable strict;
1778+
create operator % (leftarg=vops_interval, rightarg=vops_interval, procedure=vops_interval_rem);
1779+
create operator % (leftarg=vops_interval, rightarg=vops_int8, procedure=vops_interval_int_rem);
1780+
create operator % (leftarg=vops_interval, rightarg=int8, procedure=vops_interval_rem_int_rconst);
1781+
create operator % (leftarg=vops_interval, rightarg=interval, procedure=vops_interval_rem_rconst);
1782+
create operator % (leftarg=interval, rightarg=vops_interval, procedure=vops_interval_rem_lconst);
1783+
17461784
create function vops_interval_eq(left vops_interval, right vops_interval) returns vops_bool as 'MODULE_PATHNAME','vops_int8_eq' language C parallel safe immutable strict;
17471785
create function vops_interval_eq_rconst(left vops_interval, right interval) returns vops_bool as 'MODULE_PATHNAME','vops_int8_eq_rconst' language C parallel safe immutable strict;
17481786
create function vops_interval_eq_lconst(left interval, right vops_interval) returns vops_bool as 'MODULE_PATHNAME','vops_int8_eq_lconst' language C parallel safe immutable strict;
@@ -2054,6 +2092,13 @@ create operator / (leftarg=vops_int8, rightarg=vops_int8, procedure=vops_int8_di
20542092
create operator / (leftarg=vops_int8, rightarg=int8, procedure=vops_int8_div_rconst);
20552093
create operator / (leftarg=int8, rightarg=vops_int8, procedure=vops_int8_div_lconst);
20562094

2095+
create function vops_int8_rem(left vops_int8, right vops_int8) returns vops_int8 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
2096+
create function vops_int8_rem_rconst(left vops_int8, right int8) returns vops_int8 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
2097+
create function vops_int8_rem_lconst(left int8, right vops_int8) returns vops_int8 as 'MODULE_PATHNAME' language C parallel safe immutable strict;
2098+
create operator % (leftarg=vops_int8, rightarg=vops_int8, procedure=vops_int8_rem);
2099+
create operator % (leftarg=vops_int8, rightarg=int8, procedure=vops_int8_rem_rconst);
2100+
create operator % (leftarg=int8, rightarg=vops_int8, procedure=vops_int8_rem_lconst);
2101+
20572102
create function vops_int8_eq(left vops_int8, right vops_int8) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
20582103
create function vops_int8_eq_rconst(left vops_int8, right int8) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;
20592104
create function vops_int8_eq_lconst(left int8, right vops_int8) returns vops_bool as 'MODULE_PATHNAME' language C parallel safe immutable strict;

vops.c

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ void _PG_init(void);
5858
void _PG_fini(void);
5959

6060
uint64 filter_mask = ~0;
61-
6261
static struct {
6362
char const* name;
6463
Oid oid;
@@ -1308,38 +1307,28 @@ Datum vops_agg_deserial(PG_FUNCTION_ARGS)
13081307
PG_RETURN_POINTER(state);
13091308
}
13101309

1310+
#define REGISTER_BIN_OP(TYPE,OP,COP,XTYPE,GXTYPE) \
1311+
BIN_OP(TYPE,OP,COP) \
1312+
BIN_LCONST_OP(TYPE,XTYPE,GXTYPE,OP,COP) \
1313+
BIN_RCONST_OP(TYPE,XTYPE,GXTYPE,OP,COP)
1314+
1315+
#define REGISTER_CMP_OP(TYPE,OP,COP,XTYPE,GXTYPE) \
1316+
CMP_OP(TYPE,OP,COP) \
1317+
CMP_LCONST_OP(TYPE,XTYPE,GXTYPE,OP,COP) \
1318+
CMP_RCONST_OP(TYPE,XTYPE,GXTYPE,OP,COP)
1319+
13111320
#define REGISTER_TYPE(TYPE,SSTYPE,CTYPE,XTYPE,STYPE,GCTYPE,GXTYPE,GSTYPE,FORMAT,PREC) \
13121321
UNARY_OP(TYPE,neg,-) \
1313-
BIN_OP(TYPE,add,+) \
1314-
BIN_LCONST_OP(TYPE,XTYPE,GXTYPE,add,+) \
1315-
BIN_RCONST_OP(TYPE,XTYPE,GXTYPE,add,+) \
1316-
BIN_OP(TYPE,sub,-) \
1317-
BIN_LCONST_OP(TYPE,XTYPE,GXTYPE,sub,-) \
1318-
BIN_RCONST_OP(TYPE,XTYPE,GXTYPE,sub,-) \
1319-
BIN_OP(TYPE,mul,*) \
1320-
BIN_LCONST_OP(TYPE,XTYPE,GXTYPE,mul,*) \
1321-
BIN_RCONST_OP(TYPE,XTYPE,GXTYPE,mul,*) \
1322-
BIN_OP(TYPE,div,/) \
1323-
BIN_LCONST_OP(TYPE,XTYPE,GXTYPE,div,/) \
1324-
BIN_RCONST_OP(TYPE,XTYPE,GXTYPE,div,/) \
1325-
CMP_OP(TYPE,eq,==) \
1326-
CMP_LCONST_OP(TYPE,XTYPE,GXTYPE,eq,==) \
1327-
CMP_RCONST_OP(TYPE,XTYPE,GXTYPE,eq,==) \
1328-
CMP_OP(TYPE,ne,!=) \
1329-
CMP_LCONST_OP(TYPE,XTYPE,GXTYPE,ne,!=) \
1330-
CMP_RCONST_OP(TYPE,XTYPE,GXTYPE,ne,!=) \
1331-
CMP_OP(TYPE,lt,<) \
1332-
CMP_LCONST_OP(TYPE,XTYPE,GXTYPE,lt,<) \
1333-
CMP_RCONST_OP(TYPE,XTYPE,GXTYPE,lt,<) \
1334-
CMP_OP(TYPE,le,<=) \
1335-
CMP_LCONST_OP(TYPE,XTYPE,GXTYPE,le,<=) \
1336-
CMP_RCONST_OP(TYPE,XTYPE,GXTYPE,le,<=) \
1337-
CMP_OP(TYPE,gt,>) \
1338-
CMP_LCONST_OP(TYPE,XTYPE,GXTYPE,gt,>) \
1339-
CMP_RCONST_OP(TYPE,XTYPE,GXTYPE,gt,>) \
1340-
CMP_OP(TYPE,ge,>=) \
1341-
CMP_LCONST_OP(TYPE,XTYPE,GXTYPE,ge,>=) \
1342-
CMP_RCONST_OP(TYPE,XTYPE,GXTYPE,ge,>=) \
1322+
REGISTER_BIN_OP(TYPE,add,+,XTYPE,GXTYPE) \
1323+
REGISTER_BIN_OP(TYPE,sub,-,XTYPE,GXTYPE) \
1324+
REGISTER_BIN_OP(TYPE,mul,*,XTYPE,GXTYPE) \
1325+
REGISTER_BIN_OP(TYPE,div,/,XTYPE,GXTYPE) \
1326+
REGISTER_CMP_OP(TYPE,eq,==,XTYPE,GXTYPE) \
1327+
REGISTER_CMP_OP(TYPE,ne,!=,XTYPE,GXTYPE) \
1328+
REGISTER_CMP_OP(TYPE,lt,<,XTYPE,GXTYPE) \
1329+
REGISTER_CMP_OP(TYPE,le,<=,XTYPE,GXTYPE) \
1330+
REGISTER_CMP_OP(TYPE,gt,>,XTYPE,GXTYPE) \
1331+
REGISTER_CMP_OP(TYPE,ge,>=,XTYPE,GXTYPE) \
13431332
BETWIXT_OP(TYPE,XTYPE,GXTYPE) \
13441333
IFNULL_OP(TYPE,CTYPE,GXTYPE) \
13451334
CONST_OP(TYPE,CTYPE,GXTYPE) \
@@ -1364,13 +1353,18 @@ Datum vops_agg_deserial(PG_FUNCTION_ARGS)
13641353
GROUP_BY_FUNC(TYPE)
13651354

13661355
/* TYPE, SSTYPE, CTYPE, XTYPE, STYPE, GCTYPE, GXTYPE, GSTYPE, FORMAT, PREC */
1367-
REGISTER_TYPE( char, int8, char, char, long64, CHAR, CHAR, INT64, lld, 0)
1368-
REGISTER_TYPE( int2, int8, int16, int32, long64, INT16, INT32, INT64, lld, 0)
1369-
REGISTER_TYPE( int4, int8, int32, int32, long64, INT32, INT32, INT64, lld, 0)
1370-
REGISTER_TYPE( int8, int8, int64, int64, long64, INT64, INT64, INT64, lld, 0)
1356+
REGISTER_TYPE( char, int8, char, char, long64, CHAR, CHAR, INT64, lld, -1)
1357+
REGISTER_TYPE( int2, int8, int16, int32, long64, INT16, INT32, INT64, lld, -1)
1358+
REGISTER_TYPE( int4, int8, int32, int32, long64, INT32, INT32, INT64, lld, -1)
1359+
REGISTER_TYPE( int8, int8, int64, int64, long64, INT64, INT64, INT64, lld, -1)
13711360
REGISTER_TYPE(float4, float8, float4, float8, float8, FLOAT4, FLOAT8, FLOAT8, lg, Max(1, FLT_DIG + extra_float_digits))
13721361
REGISTER_TYPE(float8, float8, float8, float8, float8, FLOAT8, FLOAT8, FLOAT8, lg, Max(1, DBL_DIG + extra_float_digits))
13731362

1363+
REGISTER_BIN_OP(char,rem,%,char,CHAR)
1364+
REGISTER_BIN_OP(int2,rem,%,int32,INT32)
1365+
REGISTER_BIN_OP(int4,rem,%,int32,INT32)
1366+
REGISTER_BIN_OP(int8,rem,%,int64,INT64)
1367+
13741368
const size_t vops_sizeof[] =
13751369
{
13761370
sizeof(vops_bool),

vops_fdw.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,20 @@ static void postgresReScanForeignScan(ForeignScanState *node);
121121
static void postgresEndForeignScan(ForeignScanState *node);
122122
static void postgresExplainForeignScan(ForeignScanState *node,
123123
ExplainState *es);
124+
#if PG_VERSION_NUM>=110000
124125
static void postgresGetForeignUpperPaths(PlannerInfo *root,
125-
UpperRelationKind stage,
126-
RelOptInfo *input_rel,
127-
RelOptInfo *output_rel);
126+
UpperRelationKind stage,
127+
RelOptInfo *input_rel,
128+
RelOptInfo *output_rel,
129+
void* extra
130+
);
131+
#else
132+
static void postgresGetForeignUpperPaths(PlannerInfo *root,
133+
UpperRelationKind stage,
134+
RelOptInfo *input_rel,
135+
RelOptInfo *output_rel
136+
);
137+
#endif
128138
static bool postgresIsForeignScanParallelSafe(PlannerInfo *root, RelOptInfo *rel,
129139
RangeTblEntry *rte);
130140
static bool postgresAnalyzeForeignTable(Relation relation,
@@ -785,7 +795,7 @@ postgresReScanForeignScan(ForeignScanState *node)
785795
{
786796
PgFdwScanState *fsstate = (PgFdwScanState *) node->fdw_state;
787797
Datum* values = NULL;
788-
bool* nulls = NULL;
798+
char* nulls = NULL;
789799
MemoryContext oldcontext = MemoryContextSwitchTo(fsstate->spi_context);
790800
Oid* argtypes = NULL;
791801
int rc;
@@ -804,13 +814,15 @@ postgresReScanForeignScan(ForeignScanState *node)
804814
foreach(lc, param_exprs)
805815
{
806816
ExprState *expr_state = (ExprState *) lfirst(lc);
817+
bool isnull;
807818
/* Evaluate the parameter expression */
808819
#if PG_VERSION_NUM<100000
809820
ExprDoneCond isDone;
810-
values[i] = ExecEvalExpr(expr_state, econtext, &nulls[i], &isDone);
821+
values[i] = ExecEvalExpr(expr_state, econtext, &isnull, &isDone);
811822
#else
812-
values[i] = ExecEvalExpr(expr_state, econtext, &nulls[i]);
823+
values[i] = ExecEvalExpr(expr_state, econtext, &isnull);
813824
#endif
825+
nulls[i] = (char)isnull;
814826
argtypes[i] = exprType((Node*)expr_state->expr);
815827
i += 1;
816828
}
@@ -1271,7 +1283,7 @@ foreign_grouping_ok(PlannerInfo *root, RelOptInfo *grouped_rel)
12711283
*/
12721284
static void
12731285
postgresGetForeignUpperPaths(PlannerInfo *root, UpperRelationKind stage,
1274-
RelOptInfo *input_rel, RelOptInfo *output_rel)
1286+
RelOptInfo *input_rel, RelOptInfo *output_rel, void* extra)
12751287
{
12761288
PgFdwRelationInfo *fpinfo;
12771289

0 commit comments

Comments
 (0)