mirror of
https://github.com/postgres/postgres.git
synced 2025-08-08 06:02:22 +03:00
Fix rwrite(ARRAY) on 64-bit boxes:
Instead of getting elements of array manually call deconstruct_array
This commit is contained in:
@@ -201,6 +201,8 @@ rewrite_accum(PG_FUNCTION_ARGS) {
|
||||
QUERYTYPE *q;
|
||||
QTNode *qex, *subs = NULL, *acctree;
|
||||
bool isfind = false;
|
||||
Datum *elemsp;
|
||||
int nelemsp;
|
||||
|
||||
AggregateContext = ((AggState *) fcinfo->context)->aggcontext;
|
||||
|
||||
@@ -230,14 +232,19 @@ rewrite_accum(PG_FUNCTION_ARGS) {
|
||||
if (ARR_ELEMTYPE(qa) != tsqOid)
|
||||
elog(ERROR, "array should contain tsquery type");
|
||||
|
||||
q = (QUERYTYPE*)ARR_DATA_PTR(qa);
|
||||
if ( q->size == 0 )
|
||||
deconstruct_array(qa, tsqOid, -1, false, 'i', &elemsp, &nelemsp);
|
||||
|
||||
q = (QUERYTYPE*)DatumGetPointer( elemsp[0] );
|
||||
if ( q->size == 0 ) {
|
||||
pfree( elemsp );
|
||||
PG_RETURN_POINTER( acc );
|
||||
}
|
||||
|
||||
if ( !acc->size ) {
|
||||
if ( acc->len > HDRSIZEQT )
|
||||
if ( acc->len > HDRSIZEQT ) {
|
||||
pfree( elemsp );
|
||||
PG_RETURN_POINTER( acc );
|
||||
else
|
||||
} else
|
||||
acctree = QT2QTN( GETQUERY(q), GETOPERAND(q) );
|
||||
} else
|
||||
acctree = QT2QTN( GETQUERY(acc), GETOPERAND(acc) );
|
||||
@@ -245,14 +252,16 @@ rewrite_accum(PG_FUNCTION_ARGS) {
|
||||
QTNTernary( acctree );
|
||||
QTNSort( acctree );
|
||||
|
||||
q = (QUERYTYPE*)( ((char*)ARR_DATA_PTR(qa)) + MAXALIGN( q->len ) );
|
||||
if ( q->size == 0 )
|
||||
q = (QUERYTYPE*)DatumGetPointer( elemsp[1] );
|
||||
if ( q->size == 0 ) {
|
||||
pfree( elemsp );
|
||||
PG_RETURN_POINTER( acc );
|
||||
}
|
||||
qex = QT2QTN( GETQUERY(q), GETOPERAND(q) );
|
||||
QTNTernary( qex );
|
||||
QTNSort( qex );
|
||||
|
||||
q = (QUERYTYPE*)( ((char*)q) + MAXALIGN( q->len ) );
|
||||
q = (QUERYTYPE*)DatumGetPointer( elemsp[2] );
|
||||
if ( q->size )
|
||||
subs = QT2QTN( GETQUERY(q), GETOPERAND(q) );
|
||||
|
||||
@@ -270,6 +279,7 @@ rewrite_accum(PG_FUNCTION_ARGS) {
|
||||
}
|
||||
}
|
||||
|
||||
pfree( elemsp );
|
||||
QTNFree( qex );
|
||||
QTNFree( subs );
|
||||
QTNFree( acctree );
|
||||
|
Reference in New Issue
Block a user