Commit 68c1d7d4 authored by Tom Lane's avatar Tom Lane

Dodge a macro-name conflict with Perl.

Some versions of Perl export a macro named HS_KEY.  This creates a
conflict in contrib/hstore_plperl against hstore's macro of the same
name.  The most future-proof solution seems to be to rename our macro;
I chose HSTORE_KEY.  For consistency, rename HS_VAL and related macros
similarly.

Back-patch to 9.5.  contrib/hstore_plperl doesn't exist before that
so there is no need to worry about the conflict in older releases.

Per reports from Marco Atzeri and Mike Blackwell.
parent db135e83
...@@ -76,11 +76,11 @@ typedef struct ...@@ -76,11 +76,11 @@ typedef struct
#define STRPTR(x) ( (char*)(ARRPTR(x) + HS_COUNT((HStore*)(x)) * 2) ) #define STRPTR(x) ( (char*)(ARRPTR(x) + HS_COUNT((HStore*)(x)) * 2) )
/* note multiple/non evaluations */ /* note multiple/non evaluations */
#define HS_KEY(arr_,str_,i_) ((str_) + HSE_OFF((arr_)[2*(i_)])) #define HSTORE_KEY(arr_,str_,i_) ((str_) + HSE_OFF((arr_)[2*(i_)]))
#define HS_VAL(arr_,str_,i_) ((str_) + HSE_OFF((arr_)[2*(i_)+1])) #define HSTORE_VAL(arr_,str_,i_) ((str_) + HSE_OFF((arr_)[2*(i_)+1]))
#define HS_KEYLEN(arr_,i_) (HSE_LEN((arr_)[2*(i_)])) #define HSTORE_KEYLEN(arr_,i_) (HSE_LEN((arr_)[2*(i_)]))
#define HS_VALLEN(arr_,i_) (HSE_LEN((arr_)[2*(i_)+1])) #define HSTORE_VALLEN(arr_,i_) (HSE_LEN((arr_)[2*(i_)+1]))
#define HS_VALISNULL(arr_,i_) (HSE_ISNULL((arr_)[2*(i_)+1])) #define HSTORE_VALISNULL(arr_,i_) (HSE_ISNULL((arr_)[2*(i_)+1]))
/* /*
* currently, these following macros are the _only_ places that rely * currently, these following macros are the _only_ places that rely
......
...@@ -149,7 +149,7 @@ hstoreValidNewFormat(HStore *hs) ...@@ -149,7 +149,7 @@ hstoreValidNewFormat(HStore *hs)
for (i = 1; i < count; ++i) for (i = 1; i < count; ++i)
{ {
if (HS_KEYLEN(entries, i) < HS_KEYLEN(entries, i - 1)) if (HSTORE_KEYLEN(entries, i) < HSTORE_KEYLEN(entries, i - 1))
return 0; return 0;
if (HSE_ISNULL(entries[2 * i])) if (HSE_ISNULL(entries[2 * i]))
return 0; return 0;
......
...@@ -59,14 +59,16 @@ gin_extract_hstore(PG_FUNCTION_ARGS) ...@@ -59,14 +59,16 @@ gin_extract_hstore(PG_FUNCTION_ARGS)
{ {
text *item; text *item;
item = makeitem(HS_KEY(hsent, ptr, i), HS_KEYLEN(hsent, i), item = makeitem(HSTORE_KEY(hsent, ptr, i),
HSTORE_KEYLEN(hsent, i),
KEYFLAG); KEYFLAG);
entries[2 * i] = PointerGetDatum(item); entries[2 * i] = PointerGetDatum(item);
if (HS_VALISNULL(hsent, i)) if (HSTORE_VALISNULL(hsent, i))
item = makeitem(NULL, 0, NULLFLAG); item = makeitem(NULL, 0, NULLFLAG);
else else
item = makeitem(HS_VAL(hsent, ptr, i), HS_VALLEN(hsent, i), item = makeitem(HSTORE_VAL(hsent, ptr, i),
HSTORE_VALLEN(hsent, i),
VALFLAG); VALFLAG);
entries[2 * i + 1] = PointerGetDatum(item); entries[2 * i + 1] = PointerGetDatum(item);
} }
......
...@@ -129,11 +129,13 @@ ghstore_compress(PG_FUNCTION_ARGS) ...@@ -129,11 +129,13 @@ ghstore_compress(PG_FUNCTION_ARGS)
{ {
int h; int h;
h = crc32_sz((char *) HS_KEY(hsent, ptr, i), HS_KEYLEN(hsent, i)); h = crc32_sz((char *) HSTORE_KEY(hsent, ptr, i),
HSTORE_KEYLEN(hsent, i));
HASH(GETSIGN(res), h); HASH(GETSIGN(res), h);
if (!HS_VALISNULL(hsent, i)) if (!HSTORE_VALISNULL(hsent, i))
{ {
h = crc32_sz((char *) HS_VAL(hsent, ptr, i), HS_VALLEN(hsent, i)); h = crc32_sz((char *) HSTORE_VAL(hsent, ptr, i),
HSTORE_VALLEN(hsent, i));
HASH(GETSIGN(res), h); HASH(GETSIGN(res), h);
} }
} }
...@@ -524,13 +526,15 @@ ghstore_consistent(PG_FUNCTION_ARGS) ...@@ -524,13 +526,15 @@ ghstore_consistent(PG_FUNCTION_ARGS)
for (i = 0; res && i < count; ++i) for (i = 0; res && i < count; ++i)
{ {
int crc = crc32_sz((char *) HS_KEY(qe, qv, i), HS_KEYLEN(qe, i)); int crc = crc32_sz((char *) HSTORE_KEY(qe, qv, i),
HSTORE_KEYLEN(qe, i));
if (GETBIT(sign, HASHVAL(crc))) if (GETBIT(sign, HASHVAL(crc)))
{ {
if (!HS_VALISNULL(qe, i)) if (!HSTORE_VALISNULL(qe, i))
{ {
crc = crc32_sz((char *) HS_VAL(qe, qv, i), HS_VALLEN(qe, i)); crc = crc32_sz((char *) HSTORE_VAL(qe, qv, i),
HSTORE_VALLEN(qe, i));
if (!GETBIT(sign, HASHVAL(crc))) if (!GETBIT(sign, HASHVAL(crc)))
res = false; res = false;
} }
......
...@@ -1068,7 +1068,7 @@ hstore_populate_record(PG_FUNCTION_ARGS) ...@@ -1068,7 +1068,7 @@ hstore_populate_record(PG_FUNCTION_ARGS)
column_info->column_type = column_type; column_info->column_type = column_type;
} }
if (idx < 0 || HS_VALISNULL(entries, idx)) if (idx < 0 || HSTORE_VALISNULL(entries, idx))
{ {
/* /*
* need InputFunctionCall to happen even for nulls, so that domain * need InputFunctionCall to happen even for nulls, so that domain
...@@ -1081,9 +1081,9 @@ hstore_populate_record(PG_FUNCTION_ARGS) ...@@ -1081,9 +1081,9 @@ hstore_populate_record(PG_FUNCTION_ARGS)
} }
else else
{ {
vallen = HS_VALLEN(entries, idx); vallen = HSTORE_VALLEN(entries, idx);
value = palloc(1 + vallen); value = palloc(1 + vallen);
memcpy(value, HS_VAL(entries, ptr, idx), vallen); memcpy(value, HSTORE_VAL(entries, ptr, idx), vallen);
value[vallen] = 0; value[vallen] = 0;
values[i] = InputFunctionCall(&column_info->proc, value, values[i] = InputFunctionCall(&column_info->proc, value,
...@@ -1144,11 +1144,11 @@ hstore_out(PG_FUNCTION_ARGS) ...@@ -1144,11 +1144,11 @@ hstore_out(PG_FUNCTION_ARGS)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
/* include "" and => and comma-space */ /* include "" and => and comma-space */
buflen += 6 + 2 * HS_KEYLEN(entries, i); buflen += 6 + 2 * HSTORE_KEYLEN(entries, i);
/* include "" only if nonnull */ /* include "" only if nonnull */
buflen += 2 + (HS_VALISNULL(entries, i) buflen += 2 + (HSTORE_VALISNULL(entries, i)
? 2 ? 2
: 2 * HS_VALLEN(entries, i)); : 2 * HSTORE_VALLEN(entries, i));
} }
out = ptr = palloc(buflen); out = ptr = palloc(buflen);
...@@ -1156,11 +1156,11 @@ hstore_out(PG_FUNCTION_ARGS) ...@@ -1156,11 +1156,11 @@ hstore_out(PG_FUNCTION_ARGS)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
*ptr++ = '"'; *ptr++ = '"';
ptr = cpw(ptr, HS_KEY(entries, base, i), HS_KEYLEN(entries, i)); ptr = cpw(ptr, HSTORE_KEY(entries, base, i), HSTORE_KEYLEN(entries, i));
*ptr++ = '"'; *ptr++ = '"';
*ptr++ = '='; *ptr++ = '=';
*ptr++ = '>'; *ptr++ = '>';
if (HS_VALISNULL(entries, i)) if (HSTORE_VALISNULL(entries, i))
{ {
*ptr++ = 'N'; *ptr++ = 'N';
*ptr++ = 'U'; *ptr++ = 'U';
...@@ -1170,7 +1170,7 @@ hstore_out(PG_FUNCTION_ARGS) ...@@ -1170,7 +1170,7 @@ hstore_out(PG_FUNCTION_ARGS)
else else
{ {
*ptr++ = '"'; *ptr++ = '"';
ptr = cpw(ptr, HS_VAL(entries, base, i), HS_VALLEN(entries, i)); ptr = cpw(ptr, HSTORE_VAL(entries, base, i), HSTORE_VALLEN(entries, i));
*ptr++ = '"'; *ptr++ = '"';
} }
...@@ -1203,20 +1203,20 @@ hstore_send(PG_FUNCTION_ARGS) ...@@ -1203,20 +1203,20 @@ hstore_send(PG_FUNCTION_ARGS)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
int32 keylen = HS_KEYLEN(entries, i); int32 keylen = HSTORE_KEYLEN(entries, i);
pq_sendint(&buf, keylen, 4); pq_sendint(&buf, keylen, 4);
pq_sendtext(&buf, HS_KEY(entries, base, i), keylen); pq_sendtext(&buf, HSTORE_KEY(entries, base, i), keylen);
if (HS_VALISNULL(entries, i)) if (HSTORE_VALISNULL(entries, i))
{ {
pq_sendint(&buf, -1, 4); pq_sendint(&buf, -1, 4);
} }
else else
{ {
int32 vallen = HS_VALLEN(entries, i); int32 vallen = HSTORE_VALLEN(entries, i);
pq_sendint(&buf, vallen, 4); pq_sendint(&buf, vallen, 4);
pq_sendtext(&buf, HS_VAL(entries, base, i), vallen); pq_sendtext(&buf, HSTORE_VAL(entries, base, i), vallen);
} }
} }
...@@ -1255,20 +1255,24 @@ hstore_to_json_loose(PG_FUNCTION_ARGS) ...@@ -1255,20 +1255,24 @@ hstore_to_json_loose(PG_FUNCTION_ARGS)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
resetStringInfo(&tmp); resetStringInfo(&tmp);
appendBinaryStringInfo(&tmp, HS_KEY(entries, base, i), HS_KEYLEN(entries, i)); appendBinaryStringInfo(&tmp, HSTORE_KEY(entries, base, i),
HSTORE_KEYLEN(entries, i));
escape_json(&dst, tmp.data); escape_json(&dst, tmp.data);
appendStringInfoString(&dst, ": "); appendStringInfoString(&dst, ": ");
if (HS_VALISNULL(entries, i)) if (HSTORE_VALISNULL(entries, i))
appendStringInfoString(&dst, "null"); appendStringInfoString(&dst, "null");
/* guess that values of 't' or 'f' are booleans */ /* guess that values of 't' or 'f' are booleans */
else if (HS_VALLEN(entries, i) == 1 && *(HS_VAL(entries, base, i)) == 't') else if (HSTORE_VALLEN(entries, i) == 1 &&
*(HSTORE_VAL(entries, base, i)) == 't')
appendStringInfoString(&dst, "true"); appendStringInfoString(&dst, "true");
else if (HS_VALLEN(entries, i) == 1 && *(HS_VAL(entries, base, i)) == 'f') else if (HSTORE_VALLEN(entries, i) == 1 &&
*(HSTORE_VAL(entries, base, i)) == 'f')
appendStringInfoString(&dst, "false"); appendStringInfoString(&dst, "false");
else else
{ {
resetStringInfo(&tmp); resetStringInfo(&tmp);
appendBinaryStringInfo(&tmp, HS_VAL(entries, base, i), HS_VALLEN(entries, i)); appendBinaryStringInfo(&tmp, HSTORE_VAL(entries, base, i),
HSTORE_VALLEN(entries, i));
if (IsValidJsonNumber(tmp.data, tmp.len)) if (IsValidJsonNumber(tmp.data, tmp.len))
appendBinaryStringInfo(&dst, tmp.data, tmp.len); appendBinaryStringInfo(&dst, tmp.data, tmp.len);
else else
...@@ -1306,15 +1310,17 @@ hstore_to_json(PG_FUNCTION_ARGS) ...@@ -1306,15 +1310,17 @@ hstore_to_json(PG_FUNCTION_ARGS)
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
resetStringInfo(&tmp); resetStringInfo(&tmp);
appendBinaryStringInfo(&tmp, HS_KEY(entries, base, i), HS_KEYLEN(entries, i)); appendBinaryStringInfo(&tmp, HSTORE_KEY(entries, base, i),
HSTORE_KEYLEN(entries, i));
escape_json(&dst, tmp.data); escape_json(&dst, tmp.data);
appendStringInfoString(&dst, ": "); appendStringInfoString(&dst, ": ");
if (HS_VALISNULL(entries, i)) if (HSTORE_VALISNULL(entries, i))
appendStringInfoString(&dst, "null"); appendStringInfoString(&dst, "null");
else else
{ {
resetStringInfo(&tmp); resetStringInfo(&tmp);
appendBinaryStringInfo(&tmp, HS_VAL(entries, base, i), HS_VALLEN(entries, i)); appendBinaryStringInfo(&tmp, HSTORE_VAL(entries, base, i),
HSTORE_VALLEN(entries, i));
escape_json(&dst, tmp.data); escape_json(&dst, tmp.data);
} }
...@@ -1346,20 +1352,20 @@ hstore_to_jsonb(PG_FUNCTION_ARGS) ...@@ -1346,20 +1352,20 @@ hstore_to_jsonb(PG_FUNCTION_ARGS)
val; val;
key.type = jbvString; key.type = jbvString;
key.val.string.len = HS_KEYLEN(entries, i); key.val.string.len = HSTORE_KEYLEN(entries, i);
key.val.string.val = HS_KEY(entries, base, i); key.val.string.val = HSTORE_KEY(entries, base, i);
(void) pushJsonbValue(&state, WJB_KEY, &key); (void) pushJsonbValue(&state, WJB_KEY, &key);
if (HS_VALISNULL(entries, i)) if (HSTORE_VALISNULL(entries, i))
{ {
val.type = jbvNull; val.type = jbvNull;
} }
else else
{ {
val.type = jbvString; val.type = jbvString;
val.val.string.len = HS_VALLEN(entries, i); val.val.string.len = HSTORE_VALLEN(entries, i);
val.val.string.val = HS_VAL(entries, base, i); val.val.string.val = HSTORE_VAL(entries, base, i);
} }
(void) pushJsonbValue(&state, WJB_VALUE, &val); (void) pushJsonbValue(&state, WJB_VALUE, &val);
} }
...@@ -1393,22 +1399,24 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS) ...@@ -1393,22 +1399,24 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
val; val;
key.type = jbvString; key.type = jbvString;
key.val.string.len = HS_KEYLEN(entries, i); key.val.string.len = HSTORE_KEYLEN(entries, i);
key.val.string.val = HS_KEY(entries, base, i); key.val.string.val = HSTORE_KEY(entries, base, i);
(void) pushJsonbValue(&state, WJB_KEY, &key); (void) pushJsonbValue(&state, WJB_KEY, &key);
if (HS_VALISNULL(entries, i)) if (HSTORE_VALISNULL(entries, i))
{ {
val.type = jbvNull; val.type = jbvNull;
} }
/* guess that values of 't' or 'f' are booleans */ /* guess that values of 't' or 'f' are booleans */
else if (HS_VALLEN(entries, i) == 1 && *(HS_VAL(entries, base, i)) == 't') else if (HSTORE_VALLEN(entries, i) == 1 &&
*(HSTORE_VAL(entries, base, i)) == 't')
{ {
val.type = jbvBool; val.type = jbvBool;
val.val.boolean = true; val.val.boolean = true;
} }
else if (HS_VALLEN(entries, i) == 1 && *(HS_VAL(entries, base, i)) == 'f') else if (HSTORE_VALLEN(entries, i) == 1 &&
*(HSTORE_VAL(entries, base, i)) == 'f')
{ {
val.type = jbvBool; val.type = jbvBool;
val.val.boolean = false; val.val.boolean = false;
...@@ -1418,7 +1426,8 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS) ...@@ -1418,7 +1426,8 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
is_number = false; is_number = false;
resetStringInfo(&tmp); resetStringInfo(&tmp);
appendBinaryStringInfo(&tmp, HS_VAL(entries, base, i), HS_VALLEN(entries, i)); appendBinaryStringInfo(&tmp, HSTORE_VAL(entries, base, i),
HSTORE_VALLEN(entries, i));
/* /*
* don't treat something with a leading zero followed by another * don't treat something with a leading zero followed by another
...@@ -1461,14 +1470,14 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS) ...@@ -1461,14 +1470,14 @@ hstore_to_jsonb_loose(PG_FUNCTION_ARGS)
{ {
val.type = jbvNumeric; val.type = jbvNumeric;
val.val.numeric = DatumGetNumeric( val.val.numeric = DatumGetNumeric(
DirectFunctionCall3(numeric_in, CStringGetDatum(tmp.data), 0, -1)); DirectFunctionCall3(numeric_in,
CStringGetDatum(tmp.data), 0, -1));
} }
else else
{ {
val.type = jbvString; val.type = jbvString;
val.val.string.len = HS_VALLEN(entries, i); val.val.string.len = HSTORE_VALLEN(entries, i);
val.val.string.val = HS_VAL(entries, base, i); val.val.string.val = HSTORE_VAL(entries, base, i);
} }
} }
(void) pushJsonbValue(&state, WJB_VALUE, &val); (void) pushJsonbValue(&state, WJB_VALUE, &val);
......
This diff is collapsed.
...@@ -27,8 +27,11 @@ hstore_to_plperl(PG_FUNCTION_ARGS) ...@@ -27,8 +27,11 @@ hstore_to_plperl(PG_FUNCTION_ARGS)
const char *key; const char *key;
SV *value; SV *value;
key = pnstrdup(HS_KEY(entries, base, i), HS_KEYLEN(entries, i)); key = pnstrdup(HSTORE_KEY(entries, base, i),
value = HS_VALISNULL(entries, i) ? newSV(0) : cstr2sv(pnstrdup(HS_VAL(entries, base, i), HS_VALLEN(entries, i))); HSTORE_KEYLEN(entries, i));
value = HSTORE_VALISNULL(entries, i) ? newSV(0) :
cstr2sv(pnstrdup(HSTORE_VAL(entries, base, i),
HSTORE_VALLEN(entries, i)));
(void) hv_store(hv, key, strlen(key), value, 0); (void) hv_store(hv, key, strlen(key), value, 0);
} }
......
...@@ -25,14 +25,16 @@ hstore_to_plpython(PG_FUNCTION_ARGS) ...@@ -25,14 +25,16 @@ hstore_to_plpython(PG_FUNCTION_ARGS)
{ {
PyObject *key; PyObject *key;
key = PyString_FromStringAndSize(HS_KEY(entries, base, i), HS_KEYLEN(entries, i)); key = PyString_FromStringAndSize(HSTORE_KEY(entries, base, i),
if (HS_VALISNULL(entries, i)) HSTORE_KEYLEN(entries, i));
if (HSTORE_VALISNULL(entries, i))
PyDict_SetItem(dict, key, Py_None); PyDict_SetItem(dict, key, Py_None);
else else
{ {
PyObject *value; PyObject *value;
value = PyString_FromStringAndSize(HS_VAL(entries, base, i), HS_VALLEN(entries, i)); value = PyString_FromStringAndSize(HSTORE_VAL(entries, base, i),
HSTORE_VALLEN(entries, i));
PyDict_SetItem(dict, key, value); PyDict_SetItem(dict, key, value);
Py_XDECREF(value); Py_XDECREF(value);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment