@@ -4042,30 +4042,44 @@ vops_substitute_tables_with_projections(char const* queryString, Query *query)
40424042TupleDesc tupDesc = SPI_tuptable -> tupdesc ;
40434043bool isnull ;
40444044char * projectionName = SPI_getvalue (tuple ,tupDesc ,1 );
4045- ArrayType * vectorColumns = ( ArrayType * ) DatumGetPointer ( PG_DETOAST_DATUM ( SPI_getbinval ( tuple , tupDesc , 3 , & isnull ))) ;
4046- ArrayType * scalarColumns = ( ArrayType * ) DatumGetPointer ( PG_DETOAST_DATUM ( SPI_getbinval ( tuple , tupDesc , 4 , & isnull ))) ;
4045+ ArrayType * vectorColumns = NULL ;
4046+ ArrayType * scalarColumns = NULL ;
40474047char * keyName = SPI_getvalue (tuple ,tupDesc ,5 );
40484048Datum * vectorAttnos ;
40494049Datum * scalarAttnos ;
4050+ Datum datum ;
40504051int nScalarColumns ;
40514052int nVectorColumns ;
40524053Bitmapset * vectorAttrs = NULL ;
40534054Bitmapset * scalarAttrs = NULL ;
40544055Bitmapset * allAttrs ;
40554056
4056- /* Construct set of used vector columns */
4057- deconstruct_array ( vectorColumns , INT4OID , 4 , true, 'i' ,& vectorAttnos , NULL , & nVectorColumns );
4058- for ( j = 0 ; j < nVectorColumns ; j ++ )
4057+
4058+ datum = SPI_getbinval ( tuple , tupDesc , 3 ,& isnull );
4059+ if (! isnull )
40594060{
4060- 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+ }
40614069}
40624070
4063- /* Construct set of used scalar columns */
4064- deconstruct_array (scalarColumns ,INT4OID ,4 , true,'i' ,& scalarAttnos ,NULL ,& nScalarColumns );
4065- for (j = 0 ;j < nScalarColumns ;j ++ )
4071+ datum = SPI_getbinval (tuple ,tupDesc ,4 ,& isnull );
4072+ if (!isnull )
40664073{
4067- scalarAttrs = bms_add_member (scalarAttrs ,DatumGetInt32 (scalarAttnos [j ]));
4068- }
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+ }
40694083allAttrs = bms_union (vectorAttrs ,vectorAttrs );
40704084
40714085hasAggregates |=refs -> agg != NULL ;