Fix rwrite(ARRAY) on 64-bit boxes:
authorTeodor Sigaev
Wed, 9 Nov 2005 09:26:04 +0000 (09:26 +0000)
committerTeodor Sigaev
Wed, 9 Nov 2005 09:26:04 +0000 (09:26 +0000)
Instead of getting elements of array manually call deconstruct_array

contrib/tsearch2/expected/tsearch2.out
contrib/tsearch2/query_rewrite.c
contrib/tsearch2/tsearch.sql.in

index 81c456d05c30d614c142b75b476d0246c24b8ccc..296c0ac676f874dd6e2ed3ed7996df6a8eb8ff0f 100644 (file)
@@ -13,12 +13,12 @@ psql:tsearch2.sql:342: NOTICE:  argument type tsvector is only a shell
 psql:tsearch2.sql:396: NOTICE:  type "tsquery" is not yet defined
 DETAIL:  Creating a shell type definition.
 psql:tsearch2.sql:401: NOTICE:  argument type tsquery is only a shell
-psql:tsearch2.sql:543: NOTICE:  type "gtsvector" is not yet defined
+psql:tsearch2.sql:544: NOTICE:  type "gtsvector" is not yet defined
 DETAIL:  Creating a shell type definition.
-psql:tsearch2.sql:548: NOTICE:  argument type gtsvector is only a shell
-psql:tsearch2.sql:997: NOTICE:  type "gtsq" is not yet defined
+psql:tsearch2.sql:549: NOTICE:  argument type gtsvector is only a shell
+psql:tsearch2.sql:998: NOTICE:  type "gtsq" is not yet defined
 DETAIL:  Creating a shell type definition.
-psql:tsearch2.sql:1002: NOTICE:  argument type gtsq is only a shell
+psql:tsearch2.sql:1003: NOTICE:  argument type gtsq is only a shell
 --tsvector
 SELECT '1'::tsvector;
  tsvector 
index c462097bce392787f5f5b5c9d26d8d7a959a53e4..163801c230b43f87a7359a1fff67193200d66b78 100644 (file)
@@ -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 );
index dd51128e5d2823508a23b53a3ebd8e39ea119acb..9bdf641e121d239c00ec6cd5eecd6faef3895436 100644 (file)
@@ -402,6 +402,7 @@ LANGUAGE 'C' with (isstrict);
 
 CREATE TYPE tsquery (
         INTERNALLENGTH = -1,
+        ALIGNMENT = int4,
         INPUT = tsquery_in,
         OUTPUT = tsquery_out
 );