Quantcast
Channel: Active questions tagged ubuntu - Stack Overflow
Viewing all articles
Browse latest Browse all 6159

How to set "VARSIZE" and "SET_VARSIZE" in PostgreSQL 16

$
0
0

I'm trying to build the mapnik-german-l10n on Ubuntu 22.04 but got the following error:

https://github.com/giggls/mapnik-german-l10n/blob/master/icutranslit/osml10n_translit.cpp

Here is the error:

make -C icutranslitmake[1]: Entering directory '/home/test/mapnik-german-l10n-master/icutranslit'g++ -fpic -fno-exceptions -I/usr/include/postgresql/16/server -c osml10n_translit.cpposml10n_translit.cpp: In function ‘Datum osml10n_translit(FunctionCallInfo)’:osml10n_translit.cpp:46:26: error: ‘VARSIZE’ was not declared in this scope   46 |   inbuf=(char *) malloc((VARSIZE(t) - VARHDRSZ +1)*sizeof(char));      |                          ^~~~~~~osml10n_translit.cpp:47:26: error: ‘VARDATA’ was not declared in this scope   47 |   memcpy(inbuf, (void *) VARDATA(t), VARSIZE(t) - VARHDRSZ);      |                          ^~~~~~~osml10n_translit.cpp:72:3: error: ‘SET_VARSIZE’ was not declared in this scope   72 |   SET_VARSIZE(new_text, VARHDRSZ + bufLen);      |   ^~~~~~~~~~~make[1]: *** [Makefile:13: osml10n_translit.o] Error 1make[1]: Leaving directory '/home/test/mapnik-german-l10n-master/icutranslit'make: *** [Makefile:30: icutranslit] Error 2

Here is the source code:

/* needed in icu >= 62 */#define U_USING_ICU_NAMESPACE 1#include <iostream>#include <unicode/unistr.h>#include <unicode/translit.h>extern "C" {#include <postgres.h>#include <stdlib.h>#include <string.h>#include <mb/pg_wchar.h>#include <fmgr.h>#ifdef PG_MODULE_MAGICPG_MODULE_MAGIC;#endifPG_FUNCTION_INFO_V1(osml10n_translit);Datum osml10n_translit(PG_FUNCTION_ARGS) {  Transliterator *latin_tl;  UErrorCode status = U_ZERO_ERROR;  char *inbuf,*outbuf;  if (GetDatabaseEncoding() != PG_UTF8) {    ereport(ERROR,(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),    errmsg("requires UTF8 database encoding")));  }  text *t = PG_GETARG_TEXT_P(0);  inbuf=(char *) malloc((VARSIZE(t) - VARHDRSZ +1)*sizeof(char));  memcpy(inbuf, (void *) VARDATA(t), VARSIZE(t) - VARHDRSZ);  inbuf[VARSIZE(t) - VARHDRSZ]='\0';  UnicodeString ustr(inbuf);  latin_tl = Transliterator::createInstance("Any-Latin", UTRANS_FORWARD, status);  if (latin_tl == 0) {    ereport(ERROR,(errcode(ERRCODE_SYSTEM_ERROR),    errmsg("ERROR: Transliterator::createInstance() failed")));    PG_RETURN_TEXT_P("");  }  latin_tl->transliterate(ustr);  int32_t bufLen = 100;  outbuf = (char *) malloc((bufLen + 1)*sizeof(char));  status=U_ZERO_ERROR;  bufLen = ustr.extract(outbuf,bufLen,NULL,status);  if (status == U_BUFFER_OVERFLOW_ERROR) {    status=U_ZERO_ERROR;    outbuf = (char *) realloc(outbuf, bufLen + 1);    bufLen = ustr.extract(outbuf,bufLen,NULL,status);  }  outbuf[bufLen] = '\0';   text *new_text = (text *) palloc(VARHDRSZ + bufLen);  SET_VARSIZE(new_text, VARHDRSZ + bufLen);  memcpy((void *) VARDATA(new_text), /* destination */         (void *) outbuf,bufLen);  free(inbuf);  free(outbuf);  delete latin_tl;         PG_RETURN_TEXT_P(new_text);}} /* extern "C" */

I have tried to search in postgres.h but found nothing:

/usr/include/postgresql/16/server/postgres.h

Which library contains this "VARSIZE" and "SET_VARSIZE"?

Update:

I found that /usr/include/postgresql/15/server/postgres.h contains the "VARSIZE" and "SET_VARSIZE", but the /usr/include/postgresql/16/server/postgres.h does not.

Here is the source code of /usr/include/postgresql/15/server/postgres.h

/* ---------------------------------------------------------------- *              Section 1:  variable-length datatypes (TOAST support) * ---------------------------------------------------------------- */.../* * In consumers oblivious to data alignment, call PG_DETOAST_DATUM_PACKED(), * VARDATA_ANY(), VARSIZE_ANY() and VARSIZE_ANY_EXHDR().  Elsewhere, call * PG_DETOAST_DATUM(), VARDATA() and VARSIZE().  Directly fetching an int16, * int32 or wider field in the struct representing the datum layout requires * aligned data.  memcpy() is alignment-oblivious, as are most operations on * datatypes, such as text, whose layout struct contains only char fields. * * Code assembling a new datum should call VARDATA() and SET_VARSIZE(). * (Datums begin life untoasted.) * * Other macros here should usually be used only by tuple assembly/disassembly * code and code that specifically wants to work with still-toasted Datums. */#define VARDATA(PTR)                        VARDATA_4B(PTR)#define VARSIZE(PTR)                        VARSIZE_4B(PTR)#define VARSIZE_SHORT(PTR)                  VARSIZE_1B(PTR)#define VARDATA_SHORT(PTR)                  VARDATA_1B(PTR)#define VARTAG_EXTERNAL(PTR)                VARTAG_1B_E(PTR)#define VARSIZE_EXTERNAL(PTR)               (VARHDRSZ_EXTERNAL + VARTAG_SIZE(VARTAG_EXTERNAL(PTR)))#define VARDATA_EXTERNAL(PTR)               VARDATA_1B_E(PTR).../* ---------------------------------------------------------------- *              Section 2:  Datum type + support macros * ---------------------------------------------------------------- */...typedef uintptr_t Datum;/* * A NullableDatum is used in places where both a Datum and its nullness needs * to be stored. This can be more efficient than storing datums and nullness * in separate arrays, due to better spatial locality, even if more space may * be wasted due to padding. */typedef struct NullableDatum{#define FIELDNO_NULLABLE_DATUM_DATUM 0    Datum       value;#define FIELDNO_NULLABLE_DATUM_ISNULL 1    bool        isnull;    /* due to alignment padding this could be used for flags for free */} NullableDatum;...

Here is the source code of /usr/include/postgresql/16/server/postgres.h

/* ---------------------------------------------------------------- *              Section 1:  Datum type + support functions * ---------------------------------------------------------------- *//* * A Datum contains either a value of a pass-by-value type or a pointer to a * value of a pass-by-reference type.  Therefore, we require: * * sizeof(Datum) == sizeof(void *) == 4 or 8 * * The functions below and the analogous functions for other types should be used to * convert between a Datum and the appropriate C type. */typedef uintptr_t Datum;/* * A NullableDatum is used in places where both a Datum and its nullness needs * to be stored. This can be more efficient than storing datums and nullness * in separate arrays, due to better spatial locality, even if more space may * be wasted due to padding. */typedef struct NullableDatum{#define FIELDNO_NULLABLE_DATUM_DATUM 0    Datum       value;#define FIELDNO_NULLABLE_DATUM_ISNULL 1    bool        isnull;    /* due to alignment padding this could be used for flags for free */} NullableDatum;

It seems that "postgresql 16" has removed the "Section 1: variable-length datatypes (TOAST support)" from the postgres.h.

How to set "VARSIZE" and "SET_VARSIZE" in "osml10n_translit.cpp" for making it to work in postgresql 16?


Viewing all articles
Browse latest Browse all 6159

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>