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

Commit d7d83a4

Browse files
committed
[refer #PGPRO-2361] Fix handling tables without scala attributes in vops_substitute_tables_with_projections
1 parent c0b2918 commit d7d83a4

File tree

3 files changed

+24
-16
lines changed

3 files changed

+24
-16
lines changed

expected/test.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ select sum(x) over (order by id rows between 9 preceding and current row) from s
301301
955
302302
(100 rows)
303303

304+
set vops.auto_substitute_projections=on;
304305
create table it(i interval, t varchar(4));
305306
insert into it values ('1 second','sec'), ('1 minute','min'), ('1 hour','hour');
306307
select create_projection('vit','it',array['i','t']);

sql/test.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ select populate(destination:='v2'::regclass, source:='s2'::regclass,sort:='id');
2323
select unnest(t.*) from (select msum(x,10) over (order by first(id)) from v2) t;
2424
select sum(x) over (order by id rows between 9 preceding and current row) from s2;
2525

26+
set vops.auto_substitute_projections=on;
2627
create table it(i interval, t varchar(4));
2728
insert into it values ('1 second','sec'), ('1 minute','min'), ('1 hour','hour');
2829
select create_projection('vit','it',array['i','t']);

vops.c

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4042,8 +4042,8 @@ vops_substitute_tables_with_projections(char const* queryString, Query *query)
40424042
TupleDesc tupDesc = SPI_tuptable->tupdesc;
40434043
bool isnull;
40444044
char* projectionName = SPI_getvalue(tuple, tupDesc, 1);
4045-
ArrayType* vectorColumns;
4046-
ArrayType* scalarColumns;
4045+
ArrayType* vectorColumns = NULL;
4046+
ArrayType* scalarColumns = NULL;
40474047
char* keyName = SPI_getvalue(tuple, tupDesc, 5);
40484048
Datum* vectorAttnos;
40494049
Datum* scalarAttnos;
@@ -4056,24 +4056,30 @@ vops_substitute_tables_with_projections(char const* queryString, Query *query)
40564056

40574057

40584058
datum = SPI_getbinval(tuple, tupDesc, 3, &isnull);
4059-
vectorColumns = isnull ? NULL : (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(datum));
4060-
4061-
datum = SPI_getbinval(tuple, tupDesc, 4, &isnull);
4062-
scalarColumns = isnull ? NULL : (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(datum));
4063-
4064-
/* Construct set of used vector columns */
4065-
deconstruct_array(vectorColumns, INT4OID, 4, true, 'i', &vectorAttnos, NULL, &nVectorColumns);
4066-
for (j = 0; j < nVectorColumns; j++)
4059+
if (!isnull)
40674060
{
4068-
vectorAttrs = bms_add_member(vectorAttrs, DatumGetInt32(vectorAttnos[j]));
4061+
vectorColumns = (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(datum));
4062+
4063+
/* Construct set of used vector columns */
4064+
deconstruct_array(vectorColumns, INT4OID, 4, true, 'i', &vectorAttnos, NULL, &nVectorColumns);
4065+
for (j = 0; j < nVectorColumns; j++)
4066+
{
4067+
vectorAttrs = bms_add_member(vectorAttrs, DatumGetInt32(vectorAttnos[j]));
4068+
}
40694069
}
40704070

4071-
/* Construct set of used scalar columns */
4072-
deconstruct_array(scalarColumns, INT4OID, 4, true, 'i', &scalarAttnos, NULL, &nScalarColumns);
4073-
for (j = 0; j < nScalarColumns; j++)
4071+
datum = SPI_getbinval(tuple, tupDesc, 4, &isnull);
4072+
if (!isnull)
40744073
{
4075-
scalarAttrs = bms_add_member(scalarAttrs, DatumGetInt32(scalarAttnos[j]));
4076-
}
4074+
scalarColumns = isnull ? NULL : (ArrayType*)DatumGetPointer(PG_DETOAST_DATUM(datum));
4075+
4076+
/* Construct set of used scalar columns */
4077+
deconstruct_array(scalarColumns, INT4OID, 4, true, 'i', &scalarAttnos, NULL, &nScalarColumns);
4078+
for (j = 0; j < nScalarColumns; j++)
4079+
{
4080+
scalarAttrs = bms_add_member(scalarAttrs, DatumGetInt32(scalarAttnos[j]));
4081+
}
4082+
}
40774083
allAttrs = bms_union(vectorAttrs, vectorAttrs);
40784084

40794085
hasAggregates |= refs->agg != NULL;

0 commit comments

Comments
 (0)