@@ -201,6 +201,8 @@ rewrite_accum(PG_FUNCTION_ARGS) {
201
201
QUERYTYPE * q ;
202
202
QTNode * qex , * subs = NULL , * acctree ;
203
203
bool isfind = false;
204
+ Datum * elemsp ;
205
+ int nelemsp ;
204
206
205
207
AggregateContext = ((AggState * ) fcinfo -> context )-> aggcontext ;
206
208
@@ -230,29 +232,36 @@ rewrite_accum(PG_FUNCTION_ARGS) {
230
232
if (ARR_ELEMTYPE (qa ) != tsqOid )
231
233
elog (ERROR , "array should contain tsquery type" );
232
234
233
- q = (QUERYTYPE * )ARR_DATA_PTR (qa );
234
- if ( q -> size == 0 )
235
+ deconstruct_array (qa , tsqOid , -1 , false, 'i' , & elemsp , & nelemsp );
236
+
237
+ q = (QUERYTYPE * )DatumGetPointer ( elemsp [0 ] );
238
+ if ( q -> size == 0 ) {
239
+ pfree ( elemsp );
235
240
PG_RETURN_POINTER ( acc );
241
+ }
236
242
237
243
if ( !acc -> size ) {
238
- if ( acc -> len > HDRSIZEQT )
244
+ if ( acc -> len > HDRSIZEQT ) {
245
+ pfree ( elemsp );
239
246
PG_RETURN_POINTER ( acc );
240
- else
247
+ } else
241
248
acctree = QT2QTN ( GETQUERY (q ), GETOPERAND (q ) );
242
249
} else
243
250
acctree = QT2QTN ( GETQUERY (acc ), GETOPERAND (acc ) );
244
251
245
252
QTNTernary ( acctree );
246
253
QTNSort ( acctree );
247
254
248
- q = (QUERYTYPE * )( ((char * )ARR_DATA_PTR (qa )) + MAXALIGN ( q -> len ) );
249
- if ( q -> size == 0 )
255
+ q = (QUERYTYPE * )DatumGetPointer ( elemsp [1 ] );
256
+ if ( q -> size == 0 ) {
257
+ pfree ( elemsp );
250
258
PG_RETURN_POINTER ( acc );
259
+ }
251
260
qex = QT2QTN ( GETQUERY (q ), GETOPERAND (q ) );
252
261
QTNTernary ( qex );
253
262
QTNSort ( qex );
254
263
255
- q = (QUERYTYPE * )( (( char * ) q ) + MAXALIGN ( q -> len ) );
264
+ q = (QUERYTYPE * )DatumGetPointer ( elemsp [ 2 ] );
256
265
if ( q -> size )
257
266
subs = QT2QTN ( GETQUERY (q ), GETOPERAND (q ) );
258
267
@@ -270,6 +279,7 @@ rewrite_accum(PG_FUNCTION_ARGS) {
270
279
}
271
280
}
272
281
282
+ pfree ( elemsp );
273
283
QTNFree ( qex );
274
284
QTNFree ( subs );
275
285
QTNFree ( acctree );
0 commit comments