122#define TEXTBUFLEN 1024
124#define DatumGetVarStringP(X) ((VarString *) PG_DETOAST_DATUM(X))
125#define DatumGetVarStringPP(X) ((VarString *) PG_DETOAST_DATUM_PACKED(X))
140 bool length_not_specified);
155 bool length_not_specified);
164 const char *fldsep,
const char *null_string);
170 int *argpos,
int *widthpos,
171 int *flags,
int *width);
175 int flags,
int width);
177 int flags,
int width);
265 if (dst_len >= src_len)
273 if (srcunpacked != src)
283#define VAL(CH) ((CH) - '0')
284#define DIG(VAL) ((VAL) + '0')
301 Node *escontext = fcinfo->context;
308 if (inputText[0] ==
'\\' && inputText[1] ==
'x')
310 size_t len = strlen(inputText);
322 for (bc = 0, tp = inputText; *tp !=
'\0'; bc++)
326 else if ((tp[0] ==
'\\') &&
327 (tp[1] >=
'0' && tp[1] <=
'3') &&
328 (tp[2] >=
'0' && tp[2] <=
'7') &&
329 (tp[3] >=
'0' && tp[3] <=
'7'))
331 else if ((tp[0] ==
'\\') &&
340 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
341 errmsg(
"invalid input syntax for type %s",
"bytea")));
356 else if ((tp[0] ==
'\\') &&
357 (tp[1] >=
'0' && tp[1] <=
'3') &&
358 (tp[2] >=
'0' && tp[2] <=
'7') &&
359 (tp[3] >=
'0' && tp[3] <=
'7'))
365 *rp++ = bc +
VAL(tp[3]);
369 else if ((tp[0] ==
'\\') &&
381 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
382 errmsg(
"invalid input syntax for type %s",
"bytea")));
423 else if ((
unsigned char) *vp < 0x20 || (
unsigned char) *vp > 0x7e)
436 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
448 else if ((
unsigned char) *vp < 0x20 || (
unsigned char) *vp > 0x7e)
467 elog(
ERROR,
"unrecognized \"bytea_output\" setting: %d",
485 nbytes =
buf->len -
buf->cursor;
516 bool isfirst =
false;
825 for (s = p; n > 0; n--)
911 if (length_not_specified)
918 (
errcode(ERRCODE_SUBSTRING_ERROR),
919 errmsg(
"negative substring length not allowed")));
974 if (length_not_specified)
976 slice_size = L1 = -1;
981 (
errcode(ERRCODE_SUBSTRING_ERROR),
982 errmsg(
"negative substring length not allowed")));
983 slice_size = L1 = -1;
991 slice_size = L1 = -1;
1044 if (S1 > slice_strlen)
1056 E1 =
Min(S1 + L1, slice_start + 1 + slice_strlen);
1058 E1 = slice_start + 1 + slice_strlen;
1064 for (
i = 0;
i < S1 - 1;
i++)
1074 for (
i = S1;
i < E1;
i++)
1079 memcpy(
VARDATA(ret), s, (p - s));
1087 elog(
ERROR,
"invalid backend encoding: encoding max length < 1");
1138 (
errcode(ERRCODE_SUBSTRING_ERROR),
1139 errmsg(
"negative substring length not allowed")));
1142 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1143 errmsg(
"integer out of range")));
1202 state.greedy =
false;
1243 state->greedy =
true;
1257 state->is_multibyte_char_in_char =
false;
1259 state->is_multibyte_char_in_char =
false;
1261 state->is_multibyte_char_in_char =
true;
1267 state->last_match = NULL;
1284 if (len1 >= len2 && len2 > 1 &&
state->locale->deterministic)
1286 int searchlength = len1 - len2;
1290 const char *str2 =
state->str2;
1304 if (searchlength < 16)
1306 else if (searchlength < 64)
1308 else if (searchlength < 128)
1310 else if (searchlength < 512)
1312 else if (searchlength < 2048)
1314 else if (searchlength < 4096)
1315 skiptablemask = 127;
1317 skiptablemask = 255;
1318 state->skiptablemask = skiptablemask;
1325 for (
i = 0;
i <= skiptablemask;
i++)
1326 state->skiptable[
i] = len2;
1337 for (
i = 0;
i < last;
i++)
1338 state->skiptable[(
unsigned char) str2[
i] & skiptablemask] = last -
i;
1353 int needle_len =
state->len2;
1357 if (needle_len <= 0)
1361 if (
state->last_match)
1362 start_ptr =
state->last_match +
state->last_match_len;
1364 start_ptr =
state->str1;
1378 if (
state->is_multibyte_char_in_char &&
state->locale->deterministic)
1385 while (
state->refpoint < matchptr)
1397 if (
state->refpoint > matchptr)
1399 start_ptr =
state->refpoint;
1405 state->last_match = matchptr;
1406 state->last_match_len =
state->last_match_len_tmp;
1418 int haystack_len =
state->len1;
1419 int needle_len =
state->len2;
1420 int skiptablemask =
state->skiptablemask;
1421 const char *haystack =
state->str1;
1422 const char *needle =
state->str2;
1423 const char *haystack_end = &haystack[haystack_len];
1426 Assert(start_ptr >= haystack && start_ptr <= haystack_end);
1428 state->last_match_len_tmp = needle_len;
1430 if (!
state->locale->deterministic)
1447 const char *result_hptr = NULL;
1450 while (hptr < haystack_end)
1456 if (!
state->greedy &&
1457 haystack_end - hptr >= needle_len &&
1459 return (
char *) hptr;
1465 for (
const char *test_end = hptr; test_end < haystack_end; test_end +=
pg_mblen(test_end))
1467 if (
pg_strncoll(hptr, (test_end - hptr), needle, needle_len,
state->locale) == 0)
1469 state->last_match_len_tmp = (test_end - hptr);
1481 return (
char *) result_hptr;
1483 else if (needle_len == 1)
1486 char nchar = *needle;
1489 while (hptr < haystack_end)
1492 return (
char *) hptr;
1498 const char *needle_last = &needle[needle_len - 1];
1501 hptr = start_ptr + needle_len - 1;
1502 while (hptr < haystack_end)
1526 hptr +=
state->skiptable[(
unsigned char) *hptr & skiptablemask];
1541 return state->last_match;
1556 return state->refpos + 1;
1568 state->last_match = NULL;
1590 (
errcode(ERRCODE_INDETERMINATE_COLLATION),
1591 errmsg(
"could not determine which collation to use for string comparison"),
1592 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
1621 result = memcmp(arg1, arg2,
Min(len1, len2));
1622 if ((result == 0) && (len1 != len2))
1623 result = (len1 < len2) ? -1 : 1;
1636 if (len1 == len2 && memcmp(arg1, arg2, len1) == 0)
1639 result =
pg_strncoll(arg1, len1, arg2, len2, mylocale);
1644 result = memcmp(arg1, arg2,
Min(len1, len2));
1645 if ((result == 0) && (len1 != len2))
1646 result = (len1 < len2) ? -1 : 1;
1863 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1864 errmsg(
"nondeterministic collations are not supported for substring searches")));
1931 bool collate_c =
false;
1952 if (
locale->collate_is_c)
1954 if (typid == BPCHAROID)
1956 else if (typid == NAMEOID)
1972 if (typid == NAMEOID)
2007 if (abbreviate || !collate_c)
2081 result = memcmp(a1p, a2p,
Min(len1, len2));
2082 if ((result == 0) && (len1 != len2))
2083 result = (len1 < len2) ? -1 : 1;
2118 result = memcmp(a1p, a2p,
Min(len1, len2));
2119 if ((result == 0) && (len1 != len2))
2120 result = (len1 < len2) ? -1 : 1;
2199 if (len1 == len2 && memcmp(a1p, a2p, len1) == 0)
2217 if (sss->
typid == BPCHAROID)
2246 if (len1 != sss->
last_len1 || memcmp(sss->
buf1, a1p, len1) != 0)
2249 memcpy(sss->
buf1, a1p, len1);
2250 sss->
buf1[len1] =
'\0';
2260 if (len2 != sss->
last_len2 || memcmp(sss->
buf2, a2p, len2) != 0)
2262 memcpy(sss->
buf2, a2p, len2);
2263 sss->
buf2[len2] =
'\0';
2276 result = strcmp(sss->
buf1, sss->
buf2);
2294 const size_t max_prefix_bytes =
sizeof(
Datum);
2297 char *authoritative_data =
VARDATA_ANY(authoritative);
2305 pres = (
char *) &res;
2307 memset(pres, 0, max_prefix_bytes);
2311 if (sss->
typid == BPCHAROID)
2342 memcpy(pres, authoritative_data,
Min(
len, max_prefix_bytes));
2361 memcmp(sss->
buf1, authoritative_data,
len) == 0)
2368 memcpy(sss->
buf1, authoritative_data,
len);
2378 if (sss->
buflen2 < max_prefix_bytes)
2386 max_prefix_bytes, sss->
locale);
2404 if (bsize < sss->buflen2)
2425 memcpy(pres, sss->
buf2,
Min(max_prefix_bytes, bsize));
2448#if SIZEOF_DATUM == 8
2454 hihalf = (
uint32) (res >> 32);
2475 res = DatumBigEndianToNative(res);
2479 pfree(authoritative);
2493 double abbrev_distinct,
2499 if (memtupcount < 100)
2510 if (abbrev_distinct <= 1.0)
2511 abbrev_distinct = 1.0;
2513 if (key_distinct <= 1.0)
2523 double norm_abbrev_card = abbrev_distinct / (double) memtupcount;
2525 elog(
LOG,
"varstr_abbrev: abbrev_distinct after %d: %f "
2526 "(key_distinct: %f, norm_abbrev_card: %f, prop_card: %f)",
2527 memtupcount, abbrev_distinct, key_distinct, norm_abbrev_card,
2547 if (abbrev_distinct > key_distinct * sss->
prop_card)
2574 if (memtupcount > 10000)
2592 elog(
LOG,
"varstr_abbrev: aborted abbreviation at %d "
2593 "(abbrev_distinct: %f, key_distinct: %f, prop_card: %f)",
2594 memtupcount, abbrev_distinct, key_distinct, sss->
prop_card);
2651 size_t len1 = strlen(
NameStr(*arg1));
2658 if (
collid == C_COLLATION_OID)
2659 result = (len1 == len2 &&
2677 size_t len2 = strlen(
NameStr(*arg2));
2683 if (
collid == C_COLLATION_OID)
2684 result = (len1 == len2 &&
2701 size_t len1 = strlen(
NameStr(*arg1));
2708 if (
collid == C_COLLATION_OID)
2709 result = !(len1 == len2 &&
2727 size_t len2 = strlen(
NameStr(*arg2));
2733 if (
collid == C_COLLATION_OID)
2734 result = !(len1 == len2 &&
2778#define CmpCall(cmpfunc) \
2779 DatumGetInt32(DirectFunctionCall2Coll(cmpfunc, \
2780 PG_GET_COLLATION(), \
2781 PG_GETARG_DATUM(0), \
2782 PG_GETARG_DATUM(1)))
2856 else if (len1 < len2)
2858 else if (len1 > len2)
3033#define PG_STR_GET_BYTEA(str_) \
3034 DatumGetByteaPP(DirectFunctionCall1(byteain, CStringGetDatum(str_)))
3078 bool length_not_specified)
3089 if (length_not_specified)
3101 (
errcode(ERRCODE_SUBSTRING_ERROR),
3102 errmsg(
"negative substring length not allowed")));
3179 (
errcode(ERRCODE_SUBSTRING_ERROR),
3180 errmsg(
"negative substring length not allowed")));
3183 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
3184 errmsg(
"integer out of range")));
3235 for (p = 0; p <=
px; p++)
3237 if ((*p2 == *p1) && (memcmp(p1, p2, len2) == 0))
3265 if (n < 0 || n >=
len)
3267 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
3268 errmsg(
"index %d out of valid range, 0..%d",
3298 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
3299 errmsg(
"index %" PRId64
" out of valid range, 0..%" PRId64,
3303 byteNo = (int) (n / 8);
3304 bitNo = (int) (n % 8);
3306 byte = ((
unsigned char *)
VARDATA_ANY(v))[byteNo];
3308 if (
byte & (1 << bitNo))
3332 if (n < 0 || n >=
len)
3334 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
3335 errmsg(
"index %d out of valid range, 0..%d",
3341 ((
unsigned char *)
VARDATA(res))[n] = newByte;
3370 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
3371 errmsg(
"index %" PRId64
" out of valid range, 0..%" PRId64,
3375 byteNo = (int) (n / 8);
3376 bitNo = (int) (n % 8);
3381 if (newBit != 0 && newBit != 1)
3383 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3384 errmsg(
"new bit must be 0 or 1")));
3389 oldByte = ((
unsigned char *)
VARDATA(res))[byteNo];
3392 newByte = oldByte & (~(1 << bitNo));
3394 newByte = oldByte | (1 << bitNo);
3396 ((
unsigned char *)
VARDATA(res))[byteNo] = newByte;
3410 const char *endp = p +
len;
3480 (
errcode(ERRCODE_INVALID_NAME),
3481 errmsg(
"invalid name syntax")));
3483 if (namelist ==
NIL)
3485 (
errcode(ERRCODE_INVALID_NAME),
3486 errmsg(
"invalid name syntax")));
3488 foreach(l, namelist)
3490 char *curname = (
char *)
lfirst(l);
3528 char *nextp = rawstring;
3548 curname = nextp + 1;
3551 endp = strchr(nextp + 1,
'"');
3557 memmove(endp, endp + 1, strlen(endp));
3574 if (curname == nextp)
3586 len = endp - curname;
3589 strncpy(curname, downname,
len);
3603 else if (*nextp ==
'\0')
3617 *namelist =
lappend(*namelist, curname);
3655 char *nextp = rawstring;
3675 curname = nextp + 1;
3678 endp = strchr(nextp + 1,
'"');
3684 memmove(endp, endp + 1, strlen(endp));
3693 curname = endp = nextp;
3701 if (curname == endp)
3715 else if (*nextp ==
'\0')
3732 *namelist =
lappend(*namelist, curname);
3776 char *nextp = rawstring;
3796 curname = nextp + 1;
3799 endp = strchr(nextp + 1,
'"');
3805 memmove(endp, endp + 1, strlen(endp));
3819 if (curname == nextp)
3833 else if (*nextp ==
'\0')
3844 *namelist =
lappend(*namelist, curname);
4018 if ((
cmp == 0) && (len1 != len2))
4019 cmp = (len1 < len2) ? -1 : 1;
4041 result = ((
cmp > 0) || ((
cmp == 0) && (len1 > len2)) ? arg1 : arg2);
4060 result = ((
cmp < 0) || ((
cmp == 0) && (len1 < len2)) ? arg1 : arg2);
4090 if (
len >
sizeof(result))
4092 errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4093 errmsg(
"smallint out of range"));
4097 for (
int i = 0;
i <
len;
i++)
4115 if (
len >
sizeof(result))
4117 errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4118 errmsg(
"integer out of range"));
4122 for (
int i = 0;
i <
len;
i++)
4140 if (
len >
sizeof(result))
4142 errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4143 errmsg(
"bigint out of range"));
4147 for (
int i = 0;
i <
len;
i++)
4204 int from_sub_text_len;
4217 if (src_text_len < 1 || from_sub_text_len < 1)
4242 chunk_len = curr_ptr - start_ptr;
4247 start_ptr = curr_ptr +
state.last_match_len;
4256 chunk_len = ((
char *) src_text +
VARSIZE_ANY(src_text)) - start_ptr;
4284 p = memchr(p,
'\\', p_end - p);
4291 if (*p >=
'1' && *p <=
'9')
4310 char *start_ptr,
int data_pos)
4317 const char *chunk_start = p;
4322 p = memchr(p,
'\\', p_end - p);
4327 if (p > chunk_start)
4342 if (*p >=
'1' && *p <=
'9')
4347 so = pmatch[
idx].rm_so;
4348 eo = pmatch[
idx].rm_eo;
4354 so = pmatch[0].rm_so;
4355 eo = pmatch[0].rm_eo;
4358 else if (*p ==
'\\')
4376 if (so >= 0 && eo >= 0)
4386 chunk_start = start_ptr;
4410 int cflags,
Oid collation,
4411 int search_start,
int n)
4436 if (escape_status < 2)
4450 while (search_start <= data_len)
4472 pg_regerror(regexec_result, re, errMsg,
sizeof(errMsg));
4474 (
errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
4475 errmsg(
"regular expression failed: %s", errMsg)));
4482 if (n > 0 && nmatches != n)
4489 search_start = pmatch[0].rm_eo;
4490 if (pmatch[0].rm_so == pmatch[0].rm_eo)
4499 if (pmatch[0].rm_so - data_pos > 0)
4504 pmatch[0].rm_so - data_pos);
4511 start_ptr += chunk_len;
4512 data_pos = pmatch[0].rm_so;
4518 if (escape_status > 0)
4520 start_ptr, data_pos);
4526 pmatch[0].rm_eo - data_pos);
4527 data_pos = pmatch[0].rm_eo;
4541 search_start = data_pos;
4542 if (pmatch[0].rm_so == pmatch[0].rm_eo)
4549 if (data_pos < data_len)
4553 chunk_len = ((
char *) src_text +
VARSIZE_ANY(src_text)) - start_ptr;
4575 int inputstring_len;
4586 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4587 errmsg(
"field position must not be zero")));
4593 if (inputstring_len < 1)
4600 if (fldnum == 1 || fldnum == -1)
4616 if (fldnum == 1 || fldnum == -1)
4638 end_ptr =
VARDATA_ANY(inputstring) + inputstring_len;
4641 end_ptr - start_ptr));
4645 fldnum += numfields + 1;
4664 while (found && --fldnum > 0)
4667 start_ptr = end_ptr +
state.last_match_len;
4681 int last_len = start_ptr -
VARDATA_ANY(inputstring);
4684 inputstring_len - last_len);
4721 memset(&tstate, 0,
sizeof(tstate));
4726 if (tstate.
astate == NULL)
4761 tstate.tupdesc = rsi->
setDesc;
4799 int inputstring_len;
4834 if (inputstring_len < 1)
4841 null_string, collation);
4861 chunk_len = ((
char *) inputstring +
VARSIZE_ANY(inputstring)) - start_ptr;
4868 chunk_len = end_ptr - start_ptr;
4876 null_string, collation);
4883 start_ptr = end_ptr +
state.last_match_len;
4899 while (inputstring_len > 0)
4901 int chunk_len =
pg_mblen(start_ptr);
4910 null_string, collation);
4914 start_ptr += chunk_len;
4915 inputstring_len -= chunk_len;
4934 bool is_null =
false;
4936 if (null_string &&
text_isequal(field_value, null_string, collation))
5011 const char *fldsep,
const char *null_string)
5022 bool printed =
false;
5046 if (my_extra == NULL)
5067 typlen = my_extra->
typlen;
5081 if (bitmap && (*bitmap & bitmask) == 0)
5084 if (null_string != NULL)
5095 itemvalue =
fetch_att(p, typbyval, typlen);
5113 if (bitmask == 0x100)
5134 const char *
digits =
"0123456789abcdef";
5138 char *
const end =
buf +
sizeof(
buf);
5223 if (fcinfo->flinfo->fn_extra == NULL)
5230 elog(
ERROR,
"cache lookup failed for type %u", argtypeid);
5234 *((
int *) fcinfo->flinfo->fn_extra) = typlen;
5237 typlen = *((
int *) fcinfo->flinfo->fn_extra);
5244 else if (typlen == -2)
5270 if (fcinfo->flinfo->fn_extra == NULL)
5277 elog(
ERROR,
"cache lookup failed for type %u", argtypeid);
5281 *((
int *) fcinfo->flinfo->fn_extra) = typlen;
5284 typlen = *((
int *) fcinfo->flinfo->fn_extra);
5305 elog(
ERROR,
"invalid compression method id %d", cmid);
5323 if (fcinfo->flinfo->fn_extra == NULL)
5330 elog(
ERROR,
"cache lookup failed for type %u", argtypeid);
5334 *((
int *) fcinfo->flinfo->fn_extra) = typlen;
5337 typlen = *((
int *) fcinfo->flinfo->fn_extra);
5373 elog(
ERROR,
"string_agg_transfn called in non-aggregate context");
5398 bool isfirst =
false;
5450 elog(
ERROR,
"aggregate function called in non-aggregate context");
5477 else if (state2->
len > 0)
5603 elog(
ERROR,
"could not determine data type of concat() input");
5630 bool first_arg =
true;
5673 if (foutcache == NULL)
5790 const char *endp = p +
len;
5825#define TEXT_FORMAT_FLAG_MINUS 0x0001
5827#define ADVANCE_PARSE_POINTER(ptr,end_ptr) \
5829 if (++(ptr) >= (end_ptr)) \
5831 (errcode(ERRCODE_INVALID_PARAMETER_VALUE), \
5832 errmsg("unterminated format() type specifier"), \
5833 errhint("For a single \"%%\" use \"%%%%\"."))); \
5845 const char *start_ptr;
5846 const char *end_ptr;
5851 Datum *elements = NULL;
5895 &elmlen, &elmbyval, &elmalign);
5899 &elements, &nulls, &
nitems);
5903 funcvariadic =
true;
5909 funcvariadic =
false;
5920 for (cp = start_ptr; cp < end_ptr; cp++)
5962 if (strchr(
"sIL", *cp) == NULL)
5964 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5965 errmsg(
"unrecognized format() type specifier \"%.*s\"",
5967 errhint(
"For a single \"%%\" use \"%%%%\".")));
5977 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5978 errmsg(
"too few arguments for format()")));
5990 isNull = nulls[
arg - 1];
5991 typid = element_type;
5994 elog(
ERROR,
"could not determine data type of format() input");
6001 else if (typid == INT4OID)
6003 else if (typid == INT2OID)
6010 if (typid != prev_width_type)
6016 fmgr_info(typoutputfunc, &typoutputinfo_width);
6017 prev_width_type = typid;
6034 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6035 errmsg(
"too few arguments for format()")));
6047 isNull = nulls[
arg - 1];
6048 typid = element_type;
6051 elog(
ERROR,
"could not determine data type of format() input");
6060 if (typid != prev_type)
6066 fmgr_info(typoutputfunc, &typoutputfinfo);
6085 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6086 errmsg(
"unrecognized format() type specifier \"%.*s\"",
6088 errhint(
"For a single \"%%\" use \"%%%%\".")));
6094 if (elements != NULL)
6120 const char *cp = *ptr;
6123 while (*cp >=
'0' && *cp <=
'9')
6125 int8 digit = (*cp -
'0');
6130 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
6131 errmsg(
"number is out of range")));
6167 int *argpos,
int *widthpos,
6168 int *flags,
int *width)
6170 const char *cp = start_ptr;
6193 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6194 errmsg(
"format specifies argument 0, but arguments are numbered from 1")));
6214 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6215 errmsg(
"width argument position must be ended by \"$\"")));
6221 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6222 errmsg(
"format specifies argument 0, but arguments are numbered from 1")));
6246 int flags,
int width)
6253 if (conversion ==
's')
6255 else if (conversion ==
'L')
6257 else if (conversion ==
'I')
6259 (
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
6260 errmsg(
"null values cannot be formatted as an SQL identifier")));
6268 if (conversion ==
'I')
6273 else if (conversion ==
'L')
6293 int flags,
int width)
6295 bool align_to_left =
false;
6308 align_to_left =
true;
6310 if (width <= INT_MIN)
6312 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
6313 errmsg(
"number is out of range")));
6317 align_to_left =
true;
6367#define LEVENSHTEIN_LESS_EQUAL
6397 state->max_d = max_d;
6398 state->match = NULL;
6416 if (
state->source == NULL ||
state->source[0] ==
'\0' ||
6417 candidate == NULL || candidate[0] ==
'\0')
6429 candidate, strlen(candidate), 1, 1, 1,
6430 state->max_d,
true);
6431 if (dist <= state->max_d &&
6432 dist <= strlen(
state->source) / 2 &&
6433 (
state->min_d == -1 || dist < state->min_d))
6435 state->min_d = dist;
6436 state->match = candidate;
6449 return state->match;
6467 (
errcode(ERRCODE_SYNTAX_ERROR),
6468 errmsg(
"Unicode normalization can only be performed if server encoding is UTF8")));
6480 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6481 errmsg(
"invalid normalization form: %s", formstr)));
6526 (
errmsg(
"Unicode categorization can only be performed if server encoding is UTF8")));
6531 for (
int i = 0;
i < size;
i++)
6564 for (
i = 0;
i < size;
i++)
6577 for (
pg_wchar *wp = output_chars; *wp; wp++)
6579 unsigned char buf[4];
6589 for (
pg_wchar *wp = output_chars; *wp; wp++)
6632 for (
i = 0;
i < size;
i++)
6651 for (
pg_wchar *wp = output_chars; *wp; wp++)
6654 result = (size == output_size) &&
6655 (memcmp(input_chars, output_chars, size *
sizeof(
pg_wchar)) == 0);
6666 for (
size_t i = 0;
i < n;
i++)
6667 if (!isxdigit((
unsigned char) instr[
i]))
6676 if (
c >=
'0' &&
c <=
'9')
6678 if (
c >=
'a' &&
c <=
'f')
6679 return c -
'a' + 0xA;
6680 if (
c >=
'A' &&
c <=
'F')
6681 return c -
'A' + 0xA;
6682 elog(
ERROR,
"invalid hexadecimal digit");
6692 unsigned int result = 0;
6694 for (
size_t i = 0;
i < n;
i++)
6695 result +=
hexval(instr[
i]) << (4 * (n -
i - 1));
6721 if (instr[0] ==
'\\')
6736 int offset = instr[1] ==
'u' ? 2 : 1;
6738 unicode =
hexval_n(instr + offset, 4);
6742 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6743 errmsg(
"invalid Unicode code point: %04X", unicode));
6759 pair_first = unicode;
6766 instr += 4 + offset;
6769 else if (
len >= 8 && instr[1] ==
'+' &&
isxdigits_n(instr + 2, 6))
6777 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6778 errmsg(
"invalid Unicode code point: %04X", unicode));
6794 pair_first = unicode;
6804 else if (
len >= 10 && instr[1] ==
'U' &&
isxdigits_n(instr + 2, 8))
6812 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6813 errmsg(
"invalid Unicode code point: %04X", unicode));
6829 pair_first = unicode;
6841 (
errcode(ERRCODE_SYNTAX_ERROR),
6842 errmsg(
"invalid Unicode escape"),
6843 errhint(
"Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX.")));
6866 (
errcode(ERRCODE_SYNTAX_ERROR),
6867 errmsg(
"invalid Unicode surrogate pair")));
Datum idx(PG_FUNCTION_ARGS)
#define PG_GETARG_ARRAYTYPE_P(n)
#define ARR_NULLBITMAP(a)
#define PG_RETURN_ARRAYTYPE_P(x)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
ArrayType * construct_empty_array(Oid elmtype)
void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
int ArrayGetNItems(int ndim, const int *dims)
static Datum values[MAXATTR]
#define TextDatumGetCString(d)
#define unconstify(underlying_type, expr)
#define OidIsValid(objectId)
Size toast_datum_size(Datum value)
Size toast_raw_datum_size(Datum value)
#define VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr)
int errmsg_internal(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereturn(context, dummy_value,...)
#define ereport(elevel,...)
uint64 hex_decode_safe(const char *src, size_t len, char *dst, Node *escontext)
uint64 hex_encode(const char *src, size_t len, char *dst)
void fmgr_info(Oid functionId, FmgrInfo *finfo)
Datum DirectFunctionCall2Coll(PGFunction func, Oid collation, Datum arg1, Datum arg2)
struct varlena * pg_detoast_datum_packed(struct varlena *datum)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
char * OutputFunctionCall(FmgrInfo *flinfo, Datum val)
bool get_fn_expr_variadic(FmgrInfo *flinfo)
Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)
#define PG_FREE_IF_COPY(ptr, n)
#define DatumGetByteaPSlice(X, m, n)
#define PG_GETARG_BYTEA_PP(n)
#define PG_GETARG_TEXT_PP(n)
#define PG_RETURN_BYTEA_P(x)
#define DatumGetByteaPP(X)
#define DatumGetTextPP(X)
#define DatumGetBpCharPP(X)
#define PG_GETARG_POINTER(n)
#define PG_RETURN_CSTRING(x)
#define PG_RETURN_INT64(x)
#define PG_GETARG_DATUM(n)
#define PG_GETARG_CSTRING(n)
#define PG_GETARG_INT64(n)
#define PG_GETARG_NAME(n)
#define PG_RETURN_INT16(x)
#define PG_RETURN_TEXT_P(x)
#define DatumGetTextPSlice(X, m, n)
#define PG_RETURN_INT32(x)
#define PG_RETURN_NAME(x)
#define PG_GETARG_INT32(n)
#define PG_RETURN_DATUM(x)
#define PG_RETURN_POINTER(x)
#define PG_GET_COLLATION()
#define PG_GETARG_BYTEA_P_COPY(n)
#define PG_RETURN_BOOL(x)
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
#define MAT_SRF_USE_EXPECTED_DESC
void px(PlannerInfo *root, Gene *tour1, Gene *tour2, Gene *offspring, int num_gene, City *city_table)
static Datum hash_uint32(uint32 k)
static Datum hash_any(const unsigned char *k, int keylen)
Assert(PointerIsAligned(start, uint64))
void initHyperLogLog(hyperLogLogState *cState, uint8 bwidth)
double estimateHyperLogLog(hyperLogLogState *cState)
void addHyperLogLog(hyperLogLogState *cState, uint32 hash)
Datum int8send(PG_FUNCTION_ARGS)
Datum int2send(PG_FUNCTION_ARGS)
Datum int4send(PG_FUNCTION_ARGS)
static bool pg_mul_s32_overflow(int32 a, int32 b, int32 *result)
static bool pg_add_s32_overflow(int32 a, int32 b, int32 *result)
if(TABLE==NULL||TABLE_index==NULL)
#define MAX_LEVENSHTEIN_STRLEN
List * lappend(List *list, void *datum)
void list_free(List *list)
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
void get_type_io_data(Oid typid, IOFuncSelector which_func, int16 *typlen, bool *typbyval, char *typalign, char *typdelim, Oid *typioparam, Oid *func)
int16 get_typlen(Oid typid)
Oid get_base_element_type(Oid typid)
static pg_wchar utf8_to_unicode(const unsigned char *c)
int GetDatabaseEncoding(void)
int pg_mbstrlen_with_len(const char *mbstr, int limit)
int pg_mbcharcliplen(const char *mbstr, int len, int limit)
int pg_mbstrlen(const char *mbstr)
int pg_mbcliplen(const char *mbstr, int len, int limit)
void pg_unicode_to_server(pg_wchar c, unsigned char *s)
int pg_database_encoding_max_length(void)
int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len)
int pg_mblen(const char *mbstr)
void * MemoryContextAlloc(MemoryContext context, Size size)
char * pstrdup(const char *in)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
#define CHECK_FOR_INTERRUPTS()
int AggCheckCallContext(FunctionCallInfo fcinfo, MemoryContext *aggcontext)
int32 pg_strtoint32(const char *s)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static uint64 pg_popcount(const char *buf, int bytes)
#define PG_CACHE_LINE_SIZE
bool pg_strxfrm_enabled(pg_locale_t locale)
pg_locale_t pg_newlocale_from_collation(Oid collid)
int pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale)
bool pg_strxfrm_prefix_enabled(pg_locale_t locale)
int pg_strncoll(const char *arg1, ssize_t len1, const char *arg2, ssize_t len2, pg_locale_t locale)
size_t pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale)
size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, pg_locale_t locale)
static rewind_source * source
static unsigned char * unicode_to_utf8(pg_wchar c, unsigned char *utf8string)
#define MAX_UNICODE_EQUIVALENT_STRING
static bool is_valid_unicode_codepoint(pg_wchar c)
static pg_wchar surrogate_pair_to_codepoint(pg_wchar first, pg_wchar second)
static bool is_utf16_surrogate_first(pg_wchar c)
static bool is_utf16_surrogate_second(pg_wchar c)
int pg_strcasecmp(const char *s1, const char *s2)
void canonicalize_path(char *path)
static uint32 DatumGetUInt32(Datum X)
static bool DatumGetBool(Datum X)
static Datum PointerGetDatum(const void *X)
static Name DatumGetName(Datum X)
static char * DatumGetCString(Datum X)
static Pointer DatumGetPointer(Datum X)
static int16 DatumGetInt16(Datum X)
static int32 DatumGetInt32(Datum X)
char * quote_literal_cstr(const char *rawstr)
static int cmp(const chr *x, const chr *y, size_t len)
static unsigned hash(unsigned *uv, int n)
size_t pg_regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
int pg_regexec(regex_t *re, const chr *string, size_t len, size_t search_start, rm_detail_t *details, size_t nmatch, regmatch_t pmatch[], int flags)
regex_t * RE_compile_and_cache(text *text_re, int cflags, Oid collation)
const char * quote_identifier(const char *ident)
void truncate_identifier(char *ident, int len, bool warn)
char * downcase_truncate_identifier(const char *ident, int len, bool warn)
bool scanner_isspace(char ch)
struct SortSupportData * SortSupport
StringInfo makeStringInfo(void)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
void appendStringInfoSpaces(StringInfo str, int count)
void appendStringInfoString(StringInfo str, const char *s)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
StringInfoData * StringInfo
#define appendStringInfoCharMacro(str, ch)
static void initReadOnlyStringInfo(StringInfo str, char *data, int len)
Tuplestorestate * setResult
int(* comparator)(Datum x, Datum y, SortSupport ssup)
Datum(* abbrev_converter)(Datum original, SortSupport ssup)
int(* abbrev_full_comparator)(Datum x, Datum y, SortSupport ssup)
bool(* abbrev_abort)(int memtupcount, SortSupport ssup)
Tuplestorestate * tupstore
bool is_multibyte_char_in_char
hyperLogLogState full_card
hyperLogLogState abbr_card
ToastCompressionId toast_get_compression_id(struct varlena *attr)
@ TOAST_INVALID_COMPRESSION_ID
@ TOAST_LZ4_COMPRESSION_ID
@ TOAST_PGLZ_COMPRESSION_ID
int ssup_datum_unsigned_cmp(Datum x, Datum y, SortSupport ssup)
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, const Datum *values, const bool *isnull)
#define att_align_nominal(cur_offset, attalign)
#define att_addlength_pointer(cur_offset, attlen, attptr)
static Datum fetch_att(const void *T, bool attbyval, int attlen)
pg_unicode_category unicode_category(pg_wchar code)
UnicodeNormalizationQC unicode_is_normalized_quickcheck(UnicodeNormalizationForm form, const pg_wchar *input)
pg_wchar * unicode_normalize(UnicodeNormalizationForm form, const pg_wchar *input)
#define PG_UNICODE_VERSION
String * makeString(char *str)
#define VARATT_IS_EXTERNAL_ONDISK(PTR)
#define VARATT_IS_COMPRESSED(PTR)
#define SET_VARSIZE(PTR, len)
#define VARATT_IS_EXTERNAL(PTR)
#define VARSIZE_ANY_EXHDR(PTR)
int bpchartruelen(char *s, int len)
static int varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup)
Datum byteacat(PG_FUNCTION_ARGS)
Datum unknownrecv(PG_FUNCTION_ARGS)
Datum array_to_text(PG_FUNCTION_ARGS)
Datum byteaoverlay(PG_FUNCTION_ARGS)
static int text_cmp(text *arg1, text *arg2, Oid collid)
Datum textsend(PG_FUNCTION_ARGS)
Datum textoverlay_no_len(PG_FUNCTION_ARGS)
static void text_format_string_conversion(StringInfo buf, char conversion, FmgrInfo *typOutputInfo, Datum value, bool isNull, int flags, int width)
static text * text_overlay(text *t1, text *t2, int sp, int sl)
Datum text_format(PG_FUNCTION_ARGS)
Datum textlen(PG_FUNCTION_ARGS)
Datum pg_column_toast_chunk_id(PG_FUNCTION_ARGS)
static void text_position_setup(text *t1, text *t2, Oid collid, TextPositionState *state)
static int32 text_length(Datum str)
static bool varstr_abbrev_abort(int memtupcount, SortSupport ssup)
Datum byteaeq(PG_FUNCTION_ARGS)
Datum text_left(PG_FUNCTION_ARGS)
Datum byteagt(PG_FUNCTION_ARGS)
Datum string_agg_transfn(PG_FUNCTION_ARGS)
static bool text_isequal(text *txt1, text *txt2, Oid collid)
static void text_position_cleanup(TextPositionState *state)
Datum bytea_int2(PG_FUNCTION_ARGS)
static text * text_catenate(text *t1, text *t2)
static text * concat_internal(const char *sepstr, int argidx, FunctionCallInfo fcinfo)
static void appendStringInfoText(StringInfo str, const text *t)
Datum textgtname(PG_FUNCTION_ARGS)
Datum textout(PG_FUNCTION_ARGS)
Datum textcat(PG_FUNCTION_ARGS)
Datum text_substr(PG_FUNCTION_ARGS)
Datum bytea_string_agg_finalfn(PG_FUNCTION_ARGS)
Datum text_smaller(PG_FUNCTION_ARGS)
static text * text_substring(Datum str, int32 start, int32 length, bool length_not_specified)
static int check_replace_text_has_escape(const text *replace_text)
Datum text_concat_ws(PG_FUNCTION_ARGS)
static int internal_text_pattern_compare(text *arg1, text *arg2)
Datum string_agg_serialize(PG_FUNCTION_ARGS)
Datum text_ge(PG_FUNCTION_ARGS)
static int varlenafastcmp_locale(Datum x, Datum y, SortSupport ssup)
Datum array_to_text_null(PG_FUNCTION_ARGS)
static const char * text_format_parse_format(const char *start_ptr, const char *end_ptr, int *argpos, int *widthpos, int *flags, int *width)
Datum int2_bytea(PG_FUNCTION_ARGS)
Datum text_larger(PG_FUNCTION_ARGS)
Datum byteapos(PG_FUNCTION_ARGS)
Datum unicode_assigned(PG_FUNCTION_ARGS)
static bytea * bytea_overlay(bytea *t1, bytea *t2, int sp, int sl)
int varstr_cmp(const char *arg1, int len1, const char *arg2, int len2, Oid collid)
static char * text_position_get_match_ptr(TextPositionState *state)
static int bpcharfastcmp_c(Datum x, Datum y, SortSupport ssup)
Datum text_to_array_null(PG_FUNCTION_ARGS)
static unsigned int hexval_n(const char *instr, size_t n)
Datum byteane(PG_FUNCTION_ARGS)
static bool rest_of_char_same(const char *s1, const char *s2, int len)
Datum byteage(PG_FUNCTION_ARGS)
text * cstring_to_text_with_len(const char *s, int len)
Datum byteacmp(PG_FUNCTION_ARGS)
Datum text_to_table_null(PG_FUNCTION_ARGS)
Datum text_right(PG_FUNCTION_ARGS)
Datum textne(PG_FUNCTION_ARGS)
Datum textrecv(PG_FUNCTION_ARGS)
Datum byteaGetBit(PG_FUNCTION_ARGS)
static void text_format_append_string(StringInfo buf, const char *str, int flags, int width)
static int text_position(text *t1, text *t2, Oid collid)
bool SplitDirectoriesString(char *rawstring, char separator, List **namelist)
Datum bytea_bit_count(PG_FUNCTION_ARGS)
Datum unicode_normalize_func(PG_FUNCTION_ARGS)
Datum bttext_pattern_sortsupport(PG_FUNCTION_ARGS)
static void split_text_accum_result(SplitTextOutputData *tstate, text *field_value, text *null_string, Oid collation)
Datum byteaSetBit(PG_FUNCTION_ARGS)
Datum split_part(PG_FUNCTION_ARGS)
Datum texteqname(PG_FUNCTION_ARGS)
Datum text_substr_no_len(PG_FUNCTION_ARGS)
Datum text_name(PG_FUNCTION_ARGS)
Datum byteaSetByte(PG_FUNCTION_ARGS)
Datum text_le(PG_FUNCTION_ARGS)
const char * getClosestMatch(ClosestMatchState *state)
static void text_position_reset(TextPositionState *state)
Datum text_to_table(PG_FUNCTION_ARGS)
#define ADVANCE_PARSE_POINTER(ptr, end_ptr)
Datum textnename(PG_FUNCTION_ARGS)
static char * text_position_next_internal(char *start_ptr, TextPositionState *state)
static FmgrInfo * build_concat_foutcache(FunctionCallInfo fcinfo, int argidx)
Datum to_hex64(PG_FUNCTION_ARGS)
Datum text_to_array(PG_FUNCTION_ARGS)
Datum bytea_substr_no_len(PG_FUNCTION_ARGS)
Datum unicode_is_normalized(PG_FUNCTION_ARGS)
#define TEXT_FORMAT_FLAG_MINUS
static void check_collation_set(Oid collid)
bool SplitGUCList(char *rawstring, char separator, List **namelist)
static text * convert_to_base(uint64 value, int base)
Datum textoverlay(PG_FUNCTION_ARGS)
static void appendStringInfoRegexpSubstr(StringInfo str, text *replace_text, regmatch_t *pmatch, char *start_ptr, int data_pos)
bool SplitIdentifierString(char *rawstring, char separator, List **namelist)
static text * array_to_text_internal(FunctionCallInfo fcinfo, ArrayType *v, const char *fldsep, const char *null_string)
Datum to_hex32(PG_FUNCTION_ARGS)
Datum text_starts_with(PG_FUNCTION_ARGS)
Datum byteale(PG_FUNCTION_ARGS)
Datum text_gt(PG_FUNCTION_ARGS)
Datum text_reverse(PG_FUNCTION_ARGS)
Datum to_bin64(PG_FUNCTION_ARGS)
Datum texteq(PG_FUNCTION_ARGS)
Datum to_oct64(PG_FUNCTION_ARGS)
Datum text_pattern_gt(PG_FUNCTION_ARGS)
static int charlen_to_bytelen(const char *p, int n)
void varstr_sortsupport(SortSupport ssup, Oid typid, Oid collid)
static int namefastcmp_c(Datum x, Datum y, SortSupport ssup)
#define PG_STR_GET_BYTEA(str_)
static StringInfo makeStringAggState(FunctionCallInfo fcinfo)
Datum textlename(PG_FUNCTION_ARGS)
Datum icu_unicode_version(PG_FUNCTION_ARGS)
static int namefastcmp_locale(Datum x, Datum y, SortSupport ssup)
Datum int8_bytea(PG_FUNCTION_ARGS)
Datum bytea_int4(PG_FUNCTION_ARGS)
Datum bytearecv(PG_FUNCTION_ARGS)
static Datum varstr_abbrev_convert(Datum original, SortSupport ssup)
text * cstring_to_text(const char *s)
Datum text_concat(PG_FUNCTION_ARGS)
Datum text_pattern_lt(PG_FUNCTION_ARGS)
Datum text_pattern_ge(PG_FUNCTION_ARGS)
Datum btvarstrequalimage(PG_FUNCTION_ARGS)
Datum bytea_smaller(PG_FUNCTION_ARGS)
Datum nameletext(PG_FUNCTION_ARGS)
text * replace_text_regexp(text *src_text, text *pattern_text, text *replace_text, int cflags, Oid collation, int search_start, int n)
Datum namenetext(PG_FUNCTION_ARGS)
static int text_position_get_match_pos(TextPositionState *state)
void text_to_cstring_buffer(const text *src, char *dst, size_t dst_len)
Datum to_bin32(PG_FUNCTION_ARGS)
Datum bytea_sortsupport(PG_FUNCTION_ARGS)
static bytea * bytea_substring(Datum str, int S, int L, bool length_not_specified)
Datum to_oct32(PG_FUNCTION_ARGS)
Datum namegttext(PG_FUNCTION_ARGS)
Datum unicode_version(PG_FUNCTION_ARGS)
Datum namegetext(PG_FUNCTION_ARGS)
static UnicodeNormalizationForm unicode_norm_form_from_string(const char *formstr)
static bytea * bytea_catenate(bytea *t1, bytea *t2)
static bool text_position_next(TextPositionState *state)
Datum textoctetlen(PG_FUNCTION_ARGS)
Datum bytea_reverse(PG_FUNCTION_ARGS)
Datum textltname(PG_FUNCTION_ARGS)
Datum byteaoverlay_no_len(PG_FUNCTION_ARGS)
Datum bytea_int8(PG_FUNCTION_ARGS)
Datum bttextsortsupport(PG_FUNCTION_ARGS)
Datum bytea_larger(PG_FUNCTION_ARGS)
Datum text_format_nv(PG_FUNCTION_ARGS)
Datum textpos(PG_FUNCTION_ARGS)
static int varstrfastcmp_c(Datum x, Datum y, SortSupport ssup)
Datum bttext_pattern_cmp(PG_FUNCTION_ARGS)
Datum string_agg_finalfn(PG_FUNCTION_ARGS)
Datum byteaoctetlen(PG_FUNCTION_ARGS)
Datum unistr(PG_FUNCTION_ARGS)
static unsigned int hexval(unsigned char c)
static bool text_format_parse_digits(const char **ptr, const char *end_ptr, int *value)
Datum unknownin(PG_FUNCTION_ARGS)
static bool isxdigits_n(const char *instr, size_t n)
Datum string_agg_deserialize(PG_FUNCTION_ARGS)
Datum byteaout(PG_FUNCTION_ARGS)
Datum namelttext(PG_FUNCTION_ARGS)
Datum pg_column_size(PG_FUNCTION_ARGS)
Datum byteain(PG_FUNCTION_ARGS)
#define DatumGetVarStringPP(X)
Datum pg_column_compression(PG_FUNCTION_ARGS)
Datum name_text(PG_FUNCTION_ARGS)
Datum bytea_string_agg_transfn(PG_FUNCTION_ARGS)
Datum nameeqtext(PG_FUNCTION_ARGS)
Datum bttextnamecmp(PG_FUNCTION_ARGS)
void initClosestMatch(ClosestMatchState *state, const char *source, int max_d)
Datum textin(PG_FUNCTION_ARGS)
Datum string_agg_combine(PG_FUNCTION_ARGS)
Datum byteaGetByte(PG_FUNCTION_ARGS)
Datum btnametextcmp(PG_FUNCTION_ARGS)
Datum unknownsend(PG_FUNCTION_ARGS)
Datum text_pattern_le(PG_FUNCTION_ARGS)
void updateClosestMatch(ClosestMatchState *state, const char *candidate)
Datum int4_bytea(PG_FUNCTION_ARGS)
char * text_to_cstring(const text *t)
Datum bttextcmp(PG_FUNCTION_ARGS)
Datum unknownout(PG_FUNCTION_ARGS)
Datum replace_text(PG_FUNCTION_ARGS)
Datum textgename(PG_FUNCTION_ARGS)
List * textToQualifiedNameList(text *textval)
static bool split_text(FunctionCallInfo fcinfo, SplitTextOutputData *tstate)
Datum bytea_substr(PG_FUNCTION_ARGS)
Datum bytealt(PG_FUNCTION_ARGS)
Datum byteasend(PG_FUNCTION_ARGS)
Datum text_lt(PG_FUNCTION_ARGS)
int varstr_levenshtein_less_equal(const char *source, int slen, const char *target, int tlen, int ins_c, int del_c, int sub_c, int max_d, bool trusted)