@@ -4042,30 +4042,44 @@ vops_substitute_tables_with_projections(char const* queryString, Query *query)
4042
4042
TupleDesc tupDesc = SPI_tuptable -> tupdesc ;
4043
4043
bool isnull ;
4044
4044
char * 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 ;
4047
4047
char * keyName = SPI_getvalue (tuple , tupDesc , 5 );
4048
4048
Datum * vectorAttnos ;
4049
4049
Datum * scalarAttnos ;
4050
+ Datum datum ;
4050
4051
int nScalarColumns ;
4051
4052
int nVectorColumns ;
4052
4053
Bitmapset * vectorAttrs = NULL ;
4053
4054
Bitmapset * scalarAttrs = NULL ;
4054
4055
Bitmapset * allAttrs ;
4055
4056
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 )
4059
4060
{
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
+ }
4061
4069
}
4062
4070
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 )
4066
4073
{
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
+ }
4069
4083
allAttrs = bms_union (vectorAttrs , vectorAttrs );
4070
4084
4071
4085
hasAggregates |= refs -> agg != NULL ;
0 commit comments