]> granicus.if.org Git - postgresql/commitdiff
Resort tsvector's lexemes in tsvectorrecv instead of emmiting an error.
authorTeodor Sigaev <teodor@sigaev.ru>
Thu, 21 May 2009 20:09:36 +0000 (20:09 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Thu, 21 May 2009 20:09:36 +0000 (20:09 +0000)
Basically, it's needed to support binary dump from 8.3 because ordering rule
was changed.

Per discussion with Bruce.

src/backend/utils/adt/tsvector.c

index ba2fef94aad8870e72a93ada155a91f543cf9999..f44969572514de71af0b6853346bbb911a53ae5a 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/tsvector.c,v 1.16 2009/05/21 12:54:27 meskes Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/tsvector.c,v 1.17 2009/05/21 20:09:36 teodor Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -451,6 +451,7 @@ tsvectorrecv(PG_FUNCTION_ARGS)
                                                                 * WordEntries */
        Size            hdrlen;
        Size            len;                    /* allocated size of vec */
+       bool            needSort = false;
 
        nentries = pq_getmsgint(buf, sizeof(int32));
        if (nentries < 0 || nentries > (MaxAllocSize / sizeof(WordEntry)))
@@ -507,7 +508,7 @@ tsvectorrecv(PG_FUNCTION_ARGS)
                if (i > 0 && WordEntryCMP(&vec->entries[i],
                                                                  &vec->entries[i - 1],
                                                                  STRPTR(vec)) <= 0)
-                       elog(ERROR, "lexemes are misordered");
+                       needSort = true;
 
                /* Receive positions */
                if (npos > 0)
@@ -542,5 +543,9 @@ tsvectorrecv(PG_FUNCTION_ARGS)
 
        SET_VARSIZE(vec, hdrlen + datalen);
 
+       if (needSort)
+               qsort_arg((void *) ARRPTR(vec), vec->size, sizeof(WordEntry),   
+                                       compareentry, (void*)STRPTR(vec));
+
        PG_RETURN_TSVECTOR(vec);
 }