PostgreSQL Source Code  git master
varlena.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * varlena.c
4  * Functions for the variable-length built-in types.
5  *
6  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  * src/backend/utils/adt/varlena.c
12  *
13  *-------------------------------------------------------------------------
14  */
15 #include "postgres.h"
16 
17 #include <ctype.h>
18 #include <limits.h>
19 
20 #include "access/detoast.h"
22 #include "catalog/pg_collation.h"
23 #include "catalog/pg_type.h"
24 #include "common/hashfn.h"
25 #include "common/int.h"
27 #include "common/unicode_norm.h"
28 #include "common/unicode_version.h"
29 #include "funcapi.h"
30 #include "lib/hyperloglog.h"
31 #include "libpq/pqformat.h"
32 #include "miscadmin.h"
33 #include "nodes/execnodes.h"
34 #include "parser/scansup.h"
35 #include "port/pg_bswap.h"
36 #include "regex/regex.h"
37 #include "utils/builtins.h"
38 #include "utils/bytea.h"
39 #include "utils/guc.h"
40 #include "utils/lsyscache.h"
41 #include "utils/memutils.h"
42 #include "utils/pg_locale.h"
43 #include "utils/sortsupport.h"
44 #include "utils/varlena.h"
45 
46 
47 /* GUC variable */
49 
50 typedef struct varlena VarString;
51 
52 /*
53  * State for text_position_* functions.
54  */
55 typedef struct
56 {
57  bool is_multibyte_char_in_char; /* need to check char boundaries? */
58 
59  char *str1; /* haystack string */
60  char *str2; /* needle string */
61  int len1; /* string lengths in bytes */
62  int len2;
63 
64  /* Skip table for Boyer-Moore-Horspool search algorithm: */
65  int skiptablemask; /* mask for ANDing with skiptable subscripts */
66  int skiptable[256]; /* skip distance for given mismatched char */
67 
68  char *last_match; /* pointer to last match in 'str1' */
69 
70  /*
71  * Sometimes we need to convert the byte position of a match to a
72  * character position. These store the last position that was converted,
73  * so that on the next call, we can continue from that point, rather than
74  * count characters from the very beginning.
75  */
76  char *refpoint; /* pointer within original haystack string */
77  int refpos; /* 0-based character offset of the same point */
79 
80 typedef struct
81 {
82  char *buf1; /* 1st string, or abbreviation original string
83  * buf */
84  char *buf2; /* 2nd string, or abbreviation strxfrm() buf */
85  int buflen1; /* Allocated length of buf1 */
86  int buflen2; /* Allocated length of buf2 */
87  int last_len1; /* Length of last buf1 string/strxfrm() input */
88  int last_len2; /* Length of last buf2 string/strxfrm() blob */
89  int last_returned; /* Last comparison result (cache) */
90  bool cache_blob; /* Does buf2 contain strxfrm() blob, etc? */
91  bool collate_c;
92  Oid typid; /* Actual datatype (text/bpchar/bytea/name) */
93  hyperLogLogState abbr_card; /* Abbreviated key cardinality state */
94  hyperLogLogState full_card; /* Full key cardinality state */
95  double prop_card; /* Required cardinality proportion */
98 
99 /*
100  * Output data for split_text(): we output either to an array or a table.
101  * tupstore and tupdesc must be set up in advance to output to a table.
102  */
103 typedef struct
104 {
109 
110 /*
111  * This should be large enough that most strings will fit, but small enough
112  * that we feel comfortable putting it on the stack
113  */
114 #define TEXTBUFLEN 1024
115 
116 #define DatumGetVarStringP(X) ((VarString *) PG_DETOAST_DATUM(X))
117 #define DatumGetVarStringPP(X) ((VarString *) PG_DETOAST_DATUM_PACKED(X))
118 
119 static int varstrfastcmp_c(Datum x, Datum y, SortSupport ssup);
120 static int bpcharfastcmp_c(Datum x, Datum y, SortSupport ssup);
121 static int namefastcmp_c(Datum x, Datum y, SortSupport ssup);
122 static int varlenafastcmp_locale(Datum x, Datum y, SortSupport ssup);
123 static int namefastcmp_locale(Datum x, Datum y, SortSupport ssup);
124 static int varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup);
125 static Datum varstr_abbrev_convert(Datum original, SortSupport ssup);
126 static bool varstr_abbrev_abort(int memtupcount, SortSupport ssup);
127 static int32 text_length(Datum str);
128 static text *text_catenate(text *t1, text *t2);
129 static text *text_substring(Datum str,
130  int32 start,
131  int32 length,
132  bool length_not_specified);
133 static text *text_overlay(text *t1, text *t2, int sp, int sl);
134 static int text_position(text *t1, text *t2, Oid collid);
137 static char *text_position_next_internal(char *start_ptr, TextPositionState *state);
141 static void check_collation_set(Oid collid);
142 static int text_cmp(text *arg1, text *arg2, Oid collid);
143 static bytea *bytea_catenate(bytea *t1, bytea *t2);
145  int S,
146  int L,
147  bool length_not_specified);
148 static bytea *bytea_overlay(bytea *t1, bytea *t2, int sp, int sl);
149 static void appendStringInfoText(StringInfo str, const text *t);
150 static bool split_text(FunctionCallInfo fcinfo, SplitTextOutputData *tstate);
151 static void split_text_accum_result(SplitTextOutputData *tstate,
152  text *field_value,
153  text *null_string,
154  Oid collation);
156  const char *fldsep, const char *null_string);
158 static bool text_format_parse_digits(const char **ptr, const char *end_ptr,
159  int *value);
160 static const char *text_format_parse_format(const char *start_ptr,
161  const char *end_ptr,
162  int *argpos, int *widthpos,
163  int *flags, int *width);
164 static void text_format_string_conversion(StringInfo buf, char conversion,
165  FmgrInfo *typOutputInfo,
166  Datum value, bool isNull,
167  int flags, int width);
168 static void text_format_append_string(StringInfo buf, const char *str,
169  int flags, int width);
170 
171 
172 /*****************************************************************************
173  * CONVERSION ROUTINES EXPORTED FOR USE BY C CODE *
174  *****************************************************************************/
175 
176 /*
177  * cstring_to_text
178  *
179  * Create a text value from a null-terminated C string.
180  *
181  * The new text value is freshly palloc'd with a full-size VARHDR.
182  */
183 text *
184 cstring_to_text(const char *s)
185 {
186  return cstring_to_text_with_len(s, strlen(s));
187 }
188 
189 /*
190  * cstring_to_text_with_len
191  *
192  * Same as cstring_to_text except the caller specifies the string length;
193  * the string need not be null_terminated.
194  */
195 text *
196 cstring_to_text_with_len(const char *s, int len)
197 {
198  text *result = (text *) palloc(len + VARHDRSZ);
199 
200  SET_VARSIZE(result, len + VARHDRSZ);
201  memcpy(VARDATA(result), s, len);
202 
203  return result;
204 }
205 
206 /*
207  * text_to_cstring
208  *
209  * Create a palloc'd, null-terminated C string from a text value.
210  *
211  * We support being passed a compressed or toasted text value.
212  * This is a bit bogus since such values shouldn't really be referred to as
213  * "text *", but it seems useful for robustness. If we didn't handle that
214  * case here, we'd need another routine that did, anyway.
215  */
216 char *
218 {
219  /* must cast away the const, unfortunately */
220  text *tunpacked = pg_detoast_datum_packed(unconstify(text *, t));
221  int len = VARSIZE_ANY_EXHDR(tunpacked);
222  char *result;
223 
224  result = (char *) palloc(len + 1);
225  memcpy(result, VARDATA_ANY(tunpacked), len);
226  result[len] = '\0';
227 
228  if (tunpacked != t)
229  pfree(tunpacked);
230 
231  return result;
232 }
233 
234 /*
235  * text_to_cstring_buffer
236  *
237  * Copy a text value into a caller-supplied buffer of size dst_len.
238  *
239  * The text string is truncated if necessary to fit. The result is
240  * guaranteed null-terminated (unless dst_len == 0).
241  *
242  * We support being passed a compressed or toasted text value.
243  * This is a bit bogus since such values shouldn't really be referred to as
244  * "text *", but it seems useful for robustness. If we didn't handle that
245  * case here, we'd need another routine that did, anyway.
246  */
247 void
248 text_to_cstring_buffer(const text *src, char *dst, size_t dst_len)
249 {
250  /* must cast away the const, unfortunately */
251  text *srcunpacked = pg_detoast_datum_packed(unconstify(text *, src));
252  size_t src_len = VARSIZE_ANY_EXHDR(srcunpacked);
253 
254  if (dst_len > 0)
255  {
256  dst_len--;
257  if (dst_len >= src_len)
258  dst_len = src_len;
259  else /* ensure truncation is encoding-safe */
260  dst_len = pg_mbcliplen(VARDATA_ANY(srcunpacked), src_len, dst_len);
261  memcpy(dst, VARDATA_ANY(srcunpacked), dst_len);
262  dst[dst_len] = '\0';
263  }
264 
265  if (srcunpacked != src)
266  pfree(srcunpacked);
267 }
268 
269 
270 /*****************************************************************************
271  * USER I/O ROUTINES *
272  *****************************************************************************/
273 
274 
275 #define VAL(CH) ((CH) - '0')
276 #define DIG(VAL) ((VAL) + '0')
277 
278 /*
279  * byteain - converts from printable representation of byte array
280  *
281  * Non-printable characters must be passed as '\nnn' (octal) and are
282  * converted to internal form. '\' must be passed as '\\'.
283  * ereport(ERROR, ...) if bad form.
284  *
285  * BUGS:
286  * The input is scanned twice.
287  * The error checking of input is minimal.
288  */
289 Datum
291 {
292  char *inputText = PG_GETARG_CSTRING(0);
293  Node *escontext = fcinfo->context;
294  char *tp;
295  char *rp;
296  int bc;
297  bytea *result;
298 
299  /* Recognize hex input */
300  if (inputText[0] == '\\' && inputText[1] == 'x')
301  {
302  size_t len = strlen(inputText);
303 
304  bc = (len - 2) / 2 + VARHDRSZ; /* maximum possible length */
305  result = palloc(bc);
306  bc = hex_decode_safe(inputText + 2, len - 2, VARDATA(result),
307  escontext);
308  SET_VARSIZE(result, bc + VARHDRSZ); /* actual length */
309 
310  PG_RETURN_BYTEA_P(result);
311  }
312 
313  /* Else, it's the traditional escaped style */
314  for (bc = 0, tp = inputText; *tp != '\0'; bc++)
315  {
316  if (tp[0] != '\\')
317  tp++;
318  else if ((tp[0] == '\\') &&
319  (tp[1] >= '0' && tp[1] <= '3') &&
320  (tp[2] >= '0' && tp[2] <= '7') &&
321  (tp[3] >= '0' && tp[3] <= '7'))
322  tp += 4;
323  else if ((tp[0] == '\\') &&
324  (tp[1] == '\\'))
325  tp += 2;
326  else
327  {
328  /*
329  * one backslash, not followed by another or ### valid octal
330  */
331  ereturn(escontext, (Datum) 0,
332  (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
333  errmsg("invalid input syntax for type %s", "bytea")));
334  }
335  }
336 
337  bc += VARHDRSZ;
338 
339  result = (bytea *) palloc(bc);
340  SET_VARSIZE(result, bc);
341 
342  tp = inputText;
343  rp = VARDATA(result);
344  while (*tp != '\0')
345  {
346  if (tp[0] != '\\')
347  *rp++ = *tp++;
348  else if ((tp[0] == '\\') &&
349  (tp[1] >= '0' && tp[1] <= '3') &&
350  (tp[2] >= '0' && tp[2] <= '7') &&
351  (tp[3] >= '0' && tp[3] <= '7'))
352  {
353  bc = VAL(tp[1]);
354  bc <<= 3;
355  bc += VAL(tp[2]);
356  bc <<= 3;
357  *rp++ = bc + VAL(tp[3]);
358 
359  tp += 4;
360  }
361  else if ((tp[0] == '\\') &&
362  (tp[1] == '\\'))
363  {
364  *rp++ = '\\';
365  tp += 2;
366  }
367  else
368  {
369  /*
370  * We should never get here. The first pass should not allow it.
371  */
372  ereturn(escontext, (Datum) 0,
373  (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
374  errmsg("invalid input syntax for type %s", "bytea")));
375  }
376  }
377 
378  PG_RETURN_BYTEA_P(result);
379 }
380 
381 /*
382  * byteaout - converts to printable representation of byte array
383  *
384  * In the traditional escaped format, non-printable characters are
385  * printed as '\nnn' (octal) and '\' as '\\'.
386  */
387 Datum
389 {
390  bytea *vlena = PG_GETARG_BYTEA_PP(0);
391  char *result;
392  char *rp;
393 
395  {
396  /* Print hex format */
397  rp = result = palloc(VARSIZE_ANY_EXHDR(vlena) * 2 + 2 + 1);
398  *rp++ = '\\';
399  *rp++ = 'x';
400  rp += hex_encode(VARDATA_ANY(vlena), VARSIZE_ANY_EXHDR(vlena), rp);
401  }
402  else if (bytea_output == BYTEA_OUTPUT_ESCAPE)
403  {
404  /* Print traditional escaped format */
405  char *vp;
406  uint64 len;
407  int i;
408 
409  len = 1; /* empty string has 1 char */
410  vp = VARDATA_ANY(vlena);
411  for (i = VARSIZE_ANY_EXHDR(vlena); i != 0; i--, vp++)
412  {
413  if (*vp == '\\')
414  len += 2;
415  else if ((unsigned char) *vp < 0x20 || (unsigned char) *vp > 0x7e)
416  len += 4;
417  else
418  len++;
419  }
420 
421  /*
422  * In principle len can't overflow uint32 if the input fit in 1GB, but
423  * for safety let's check rather than relying on palloc's internal
424  * check.
425  */
426  if (len > MaxAllocSize)
427  ereport(ERROR,
428  (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
429  errmsg_internal("result of bytea output conversion is too large")));
430  rp = result = (char *) palloc(len);
431 
432  vp = VARDATA_ANY(vlena);
433  for (i = VARSIZE_ANY_EXHDR(vlena); i != 0; i--, vp++)
434  {
435  if (*vp == '\\')
436  {
437  *rp++ = '\\';
438  *rp++ = '\\';
439  }
440  else if ((unsigned char) *vp < 0x20 || (unsigned char) *vp > 0x7e)
441  {
442  int val; /* holds unprintable chars */
443 
444  val = *vp;
445  rp[0] = '\\';
446  rp[3] = DIG(val & 07);
447  val >>= 3;
448  rp[2] = DIG(val & 07);
449  val >>= 3;
450  rp[1] = DIG(val & 03);
451  rp += 4;
452  }
453  else
454  *rp++ = *vp;
455  }
456  }
457  else
458  {
459  elog(ERROR, "unrecognized \"bytea_output\" setting: %d",
460  bytea_output);
461  rp = result = NULL; /* keep compiler quiet */
462  }
463  *rp = '\0';
464  PG_RETURN_CSTRING(result);
465 }
466 
467 /*
468  * bytearecv - converts external binary format to bytea
469  */
470 Datum
472 {
474  bytea *result;
475  int nbytes;
476 
477  nbytes = buf->len - buf->cursor;
478  result = (bytea *) palloc(nbytes + VARHDRSZ);
479  SET_VARSIZE(result, nbytes + VARHDRSZ);
480  pq_copymsgbytes(buf, VARDATA(result), nbytes);
481  PG_RETURN_BYTEA_P(result);
482 }
483 
484 /*
485  * byteasend - converts bytea to binary format
486  *
487  * This is a special case: just copy the input...
488  */
489 Datum
491 {
492  bytea *vlena = PG_GETARG_BYTEA_P_COPY(0);
493 
494  PG_RETURN_BYTEA_P(vlena);
495 }
496 
497 Datum
499 {
501 
502  state = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
503 
504  /* Append the value unless null, preceding it with the delimiter. */
505  if (!PG_ARGISNULL(1))
506  {
508  bool isfirst = false;
509 
510  /*
511  * You might think we can just throw away the first delimiter, however
512  * we must keep it as we may be a parallel worker doing partial
513  * aggregation building a state to send to the main process. We need
514  * to keep the delimiter of every aggregation so that the combine
515  * function can properly join up the strings of two separately
516  * partially aggregated results. The first delimiter is only stripped
517  * off in the final function. To know how much to strip off the front
518  * of the string, we store the length of the first delimiter in the
519  * StringInfo's cursor field, which we don't otherwise need here.
520  */
521  if (state == NULL)
522  {
523  state = makeStringAggState(fcinfo);
524  isfirst = true;
525  }
526 
527  if (!PG_ARGISNULL(2))
528  {
529  bytea *delim = PG_GETARG_BYTEA_PP(2);
530 
532  VARSIZE_ANY_EXHDR(delim));
533  if (isfirst)
534  state->cursor = VARSIZE_ANY_EXHDR(delim);
535  }
536 
539  }
540 
541  /*
542  * The transition type for string_agg() is declared to be "internal",
543  * which is a pass-by-value type the same size as a pointer.
544  */
545  if (state)
547  PG_RETURN_NULL();
548 }
549 
550 Datum
552 {
554 
555  /* cannot be called directly because of internal-type argument */
556  Assert(AggCheckCallContext(fcinfo, NULL));
557 
558  state = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
559 
560  if (state != NULL)
561  {
562  /* As per comment in transfn, strip data before the cursor position */
563  bytea *result;
564  int strippedlen = state->len - state->cursor;
565 
566  result = (bytea *) palloc(strippedlen + VARHDRSZ);
567  SET_VARSIZE(result, strippedlen + VARHDRSZ);
568  memcpy(VARDATA(result), &state->data[state->cursor], strippedlen);
569  PG_RETURN_BYTEA_P(result);
570  }
571  else
572  PG_RETURN_NULL();
573 }
574 
575 /*
576  * textin - converts cstring to internal representation
577  */
578 Datum
580 {
581  char *inputText = PG_GETARG_CSTRING(0);
582 
583  PG_RETURN_TEXT_P(cstring_to_text(inputText));
584 }
585 
586 /*
587  * textout - converts internal representation to cstring
588  */
589 Datum
591 {
592  Datum txt = PG_GETARG_DATUM(0);
593 
595 }
596 
597 /*
598  * textrecv - converts external binary format to text
599  */
600 Datum
602 {
604  text *result;
605  char *str;
606  int nbytes;
607 
608  str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
609 
610  result = cstring_to_text_with_len(str, nbytes);
611  pfree(str);
612  PG_RETURN_TEXT_P(result);
613 }
614 
615 /*
616  * textsend - converts text to binary format
617  */
618 Datum
620 {
621  text *t = PG_GETARG_TEXT_PP(0);
623 
627 }
628 
629 
630 /*
631  * unknownin - converts cstring to internal representation
632  */
633 Datum
635 {
636  char *str = PG_GETARG_CSTRING(0);
637 
638  /* representation is same as cstring */
640 }
641 
642 /*
643  * unknownout - converts internal representation to cstring
644  */
645 Datum
647 {
648  /* representation is same as cstring */
649  char *str = PG_GETARG_CSTRING(0);
650 
652 }
653 
654 /*
655  * unknownrecv - converts external binary format to unknown
656  */
657 Datum
659 {
661  char *str;
662  int nbytes;
663 
664  str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
665  /* representation is same as cstring */
667 }
668 
669 /*
670  * unknownsend - converts unknown to binary format
671  */
672 Datum
674 {
675  /* representation is same as cstring */
676  char *str = PG_GETARG_CSTRING(0);
678 
680  pq_sendtext(&buf, str, strlen(str));
682 }
683 
684 
685 /* ========== PUBLIC ROUTINES ========== */
686 
687 /*
688  * textlen -
689  * returns the logical length of a text*
690  * (which is less than the VARSIZE of the text*)
691  */
692 Datum
694 {
696 
697  /* try to avoid decompressing argument */
699 }
700 
701 /*
702  * text_length -
703  * Does the real work for textlen()
704  *
705  * This is broken out so it can be called directly by other string processing
706  * functions. Note that the argument is passed as a Datum, to indicate that
707  * it may still be in compressed form. We can avoid decompressing it at all
708  * in some cases.
709  */
710 static int32
712 {
713  /* fastpath when max encoding length is one */
716  else
717  {
718  text *t = DatumGetTextPP(str);
719 
721  VARSIZE_ANY_EXHDR(t)));
722  }
723 }
724 
725 /*
726  * textoctetlen -
727  * returns the physical length of a text*
728  * (which is less than the VARSIZE of the text*)
729  */
730 Datum
732 {
734 
735  /* We need not detoast the input at all */
737 }
738 
739 /*
740  * textcat -
741  * takes two text* and returns a text* that is the concatenation of
742  * the two.
743  *
744  * Rewritten by Sapa, sapa@hq.icb.chel.su. 8-Jul-96.
745  * Updated by Thomas, Thomas.Lockhart@jpl.nasa.gov 1997-07-10.
746  * Allocate space for output in all cases.
747  * XXX - thomas 1997-07-10
748  */
749 Datum
751 {
752  text *t1 = PG_GETARG_TEXT_PP(0);
753  text *t2 = PG_GETARG_TEXT_PP(1);
754 
756 }
757 
758 /*
759  * text_catenate
760  * Guts of textcat(), broken out so it can be used by other functions
761  *
762  * Arguments can be in short-header form, but not compressed or out-of-line
763  */
764 static text *
766 {
767  text *result;
768  int len1,
769  len2,
770  len;
771  char *ptr;
772 
773  len1 = VARSIZE_ANY_EXHDR(t1);
774  len2 = VARSIZE_ANY_EXHDR(t2);
775 
776  /* paranoia ... probably should throw error instead? */
777  if (len1 < 0)
778  len1 = 0;
779  if (len2 < 0)
780  len2 = 0;
781 
782  len = len1 + len2 + VARHDRSZ;
783  result = (text *) palloc(len);
784 
785  /* Set size of result string... */
786  SET_VARSIZE(result, len);
787 
788  /* Fill data field of result string... */
789  ptr = VARDATA(result);
790  if (len1 > 0)
791  memcpy(ptr, VARDATA_ANY(t1), len1);
792  if (len2 > 0)
793  memcpy(ptr + len1, VARDATA_ANY(t2), len2);
794 
795  return result;
796 }
797 
798 /*
799  * charlen_to_bytelen()
800  * Compute the number of bytes occupied by n characters starting at *p
801  *
802  * It is caller's responsibility that there actually are n characters;
803  * the string need not be null-terminated.
804  */
805 static int
806 charlen_to_bytelen(const char *p, int n)
807 {
809  {
810  /* Optimization for single-byte encodings */
811  return n;
812  }
813  else
814  {
815  const char *s;
816 
817  for (s = p; n > 0; n--)
818  s += pg_mblen(s);
819 
820  return s - p;
821  }
822 }
823 
824 /*
825  * text_substr()
826  * Return a substring starting at the specified position.
827  * - thomas 1997-12-31
828  *
829  * Input:
830  * - string
831  * - starting position (is one-based)
832  * - string length
833  *
834  * If the starting position is zero or less, then return from the start of the string
835  * adjusting the length to be consistent with the "negative start" per SQL.
836  * If the length is less than zero, return the remaining string.
837  *
838  * Added multibyte support.
839  * - Tatsuo Ishii 1998-4-21
840  * Changed behavior if starting position is less than one to conform to SQL behavior.
841  * Formerly returned the entire string; now returns a portion.
842  * - Thomas Lockhart 1998-12-10
843  * Now uses faster TOAST-slicing interface
844  * - John Gray 2002-02-22
845  * Remove "#ifdef MULTIBYTE" and test for encoding_max_length instead. Change
846  * behaviors conflicting with SQL to meet SQL (if E = S + L < S throw
847  * error; if E < 1, return '', not entire string). Fixed MB related bug when
848  * S > LC and < LC + 4 sometimes garbage characters are returned.
849  * - Joe Conway 2002-08-10
850  */
851 Datum
853 {
855  PG_GETARG_INT32(1),
856  PG_GETARG_INT32(2),
857  false));
858 }
859 
860 /*
861  * text_substr_no_len -
862  * Wrapper to avoid opr_sanity failure due to
863  * one function accepting a different number of args.
864  */
865 Datum
867 {
869  PG_GETARG_INT32(1),
870  -1, true));
871 }
872 
873 /*
874  * text_substring -
875  * Does the real work for text_substr() and text_substr_no_len()
876  *
877  * This is broken out so it can be called directly by other string processing
878  * functions. Note that the argument is passed as a Datum, to indicate that
879  * it may still be in compressed/toasted form. We can avoid detoasting all
880  * of it in some cases.
881  *
882  * The result is always a freshly palloc'd datum.
883  */
884 static text *
885 text_substring(Datum str, int32 start, int32 length, bool length_not_specified)
886 {
888  int32 S = start; /* start position */
889  int32 S1; /* adjusted start position */
890  int32 L1; /* adjusted substring length */
891  int32 E; /* end position */
892 
893  /*
894  * SQL99 says S can be zero or negative (which we don't document), but we
895  * still must fetch from the start of the string.
896  * https://www.postgresql.org/message-id/170905442373.643.11536838320909376197%40wrigleys.postgresql.org
897  */
898  S1 = Max(S, 1);
899 
900  /* life is easy if the encoding max length is 1 */
901  if (eml == 1)
902  {
903  if (length_not_specified) /* special case - get length to end of
904  * string */
905  L1 = -1;
906  else if (length < 0)
907  {
908  /* SQL99 says to throw an error for E < S, i.e., negative length */
909  ereport(ERROR,
910  (errcode(ERRCODE_SUBSTRING_ERROR),
911  errmsg("negative substring length not allowed")));
912  L1 = -1; /* silence stupider compilers */
913  }
914  else if (pg_add_s32_overflow(S, length, &E))
915  {
916  /*
917  * L could be large enough for S + L to overflow, in which case
918  * the substring must run to end of string.
919  */
920  L1 = -1;
921  }
922  else
923  {
924  /*
925  * A zero or negative value for the end position can happen if the
926  * start was negative or one. SQL99 says to return a zero-length
927  * string.
928  */
929  if (E < 1)
930  return cstring_to_text("");
931 
932  L1 = E - S1;
933  }
934 
935  /*
936  * If the start position is past the end of the string, SQL99 says to
937  * return a zero-length string -- DatumGetTextPSlice() will do that
938  * for us. We need only convert S1 to zero-based starting position.
939  */
940  return DatumGetTextPSlice(str, S1 - 1, L1);
941  }
942  else if (eml > 1)
943  {
944  /*
945  * When encoding max length is > 1, we can't get LC without
946  * detoasting, so we'll grab a conservatively large slice now and go
947  * back later to do the right thing
948  */
949  int32 slice_start;
950  int32 slice_size;
951  int32 slice_strlen;
952  text *slice;
953  int32 E1;
954  int32 i;
955  char *p;
956  char *s;
957  text *ret;
958 
959  /*
960  * We need to start at position zero because there is no way to know
961  * in advance which byte offset corresponds to the supplied start
962  * position.
963  */
964  slice_start = 0;
965 
966  if (length_not_specified) /* special case - get length to end of
967  * string */
968  slice_size = L1 = -1;
969  else if (length < 0)
970  {
971  /* SQL99 says to throw an error for E < S, i.e., negative length */
972  ereport(ERROR,
973  (errcode(ERRCODE_SUBSTRING_ERROR),
974  errmsg("negative substring length not allowed")));
975  slice_size = L1 = -1; /* silence stupider compilers */
976  }
977  else if (pg_add_s32_overflow(S, length, &E))
978  {
979  /*
980  * L could be large enough for S + L to overflow, in which case
981  * the substring must run to end of string.
982  */
983  slice_size = L1 = -1;
984  }
985  else
986  {
987  /*
988  * A zero or negative value for the end position can happen if the
989  * start was negative or one. SQL99 says to return a zero-length
990  * string.
991  */
992  if (E < 1)
993  return cstring_to_text("");
994 
995  /*
996  * if E is past the end of the string, the tuple toaster will
997  * truncate the length for us
998  */
999  L1 = E - S1;
1000 
1001  /*
1002  * Total slice size in bytes can't be any longer than the start
1003  * position plus substring length times the encoding max length.
1004  * If that overflows, we can just use -1.
1005  */
1006  if (pg_mul_s32_overflow(E, eml, &slice_size))
1007  slice_size = -1;
1008  }
1009 
1010  /*
1011  * If we're working with an untoasted source, no need to do an extra
1012  * copying step.
1013  */
1016  slice = DatumGetTextPSlice(str, slice_start, slice_size);
1017  else
1018  slice = (text *) DatumGetPointer(str);
1019 
1020  /* see if we got back an empty string */
1021  if (VARSIZE_ANY_EXHDR(slice) == 0)
1022  {
1023  if (slice != (text *) DatumGetPointer(str))
1024  pfree(slice);
1025  return cstring_to_text("");
1026  }
1027 
1028  /* Now we can get the actual length of the slice in MB characters */
1029  slice_strlen = pg_mbstrlen_with_len(VARDATA_ANY(slice),
1030  VARSIZE_ANY_EXHDR(slice));
1031 
1032  /*
1033  * Check that the start position wasn't > slice_strlen. If so, SQL99
1034  * says to return a zero-length string.
1035  */
1036  if (S1 > slice_strlen)
1037  {
1038  if (slice != (text *) DatumGetPointer(str))
1039  pfree(slice);
1040  return cstring_to_text("");
1041  }
1042 
1043  /*
1044  * Adjust L1 and E1 now that we know the slice string length. Again
1045  * remember that S1 is one based, and slice_start is zero based.
1046  */
1047  if (L1 > -1)
1048  E1 = Min(S1 + L1, slice_start + 1 + slice_strlen);
1049  else
1050  E1 = slice_start + 1 + slice_strlen;
1051 
1052  /*
1053  * Find the start position in the slice; remember S1 is not zero based
1054  */
1055  p = VARDATA_ANY(slice);
1056  for (i = 0; i < S1 - 1; i++)
1057  p += pg_mblen(p);
1058 
1059  /* hang onto a pointer to our start position */
1060  s = p;
1061 
1062  /*
1063  * Count the actual bytes used by the substring of the requested
1064  * length.
1065  */
1066  for (i = S1; i < E1; i++)
1067  p += pg_mblen(p);
1068 
1069  ret = (text *) palloc(VARHDRSZ + (p - s));
1070  SET_VARSIZE(ret, VARHDRSZ + (p - s));
1071  memcpy(VARDATA(ret), s, (p - s));
1072 
1073  if (slice != (text *) DatumGetPointer(str))
1074  pfree(slice);
1075 
1076  return ret;
1077  }
1078  else
1079  elog(ERROR, "invalid backend encoding: encoding max length < 1");
1080 
1081  /* not reached: suppress compiler warning */
1082  return NULL;
1083 }
1084 
1085 /*
1086  * textoverlay
1087  * Replace specified substring of first string with second
1088  *
1089  * The SQL standard defines OVERLAY() in terms of substring and concatenation.
1090  * This code is a direct implementation of what the standard says.
1091  */
1092 Datum
1094 {
1095  text *t1 = PG_GETARG_TEXT_PP(0);
1096  text *t2 = PG_GETARG_TEXT_PP(1);
1097  int sp = PG_GETARG_INT32(2); /* substring start position */
1098  int sl = PG_GETARG_INT32(3); /* substring length */
1099 
1100  PG_RETURN_TEXT_P(text_overlay(t1, t2, sp, sl));
1101 }
1102 
1103 Datum
1105 {
1106  text *t1 = PG_GETARG_TEXT_PP(0);
1107  text *t2 = PG_GETARG_TEXT_PP(1);
1108  int sp = PG_GETARG_INT32(2); /* substring start position */
1109  int sl;
1110 
1111  sl = text_length(PointerGetDatum(t2)); /* defaults to length(t2) */
1112  PG_RETURN_TEXT_P(text_overlay(t1, t2, sp, sl));
1113 }
1114 
1115 static text *
1116 text_overlay(text *t1, text *t2, int sp, int sl)
1117 {
1118  text *result;
1119  text *s1;
1120  text *s2;
1121  int sp_pl_sl;
1122 
1123  /*
1124  * Check for possible integer-overflow cases. For negative sp, throw a
1125  * "substring length" error because that's what should be expected
1126  * according to the spec's definition of OVERLAY().
1127  */
1128  if (sp <= 0)
1129  ereport(ERROR,
1130  (errcode(ERRCODE_SUBSTRING_ERROR),
1131  errmsg("negative substring length not allowed")));
1132  if (pg_add_s32_overflow(sp, sl, &sp_pl_sl))
1133  ereport(ERROR,
1134  (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1135  errmsg("integer out of range")));
1136 
1137  s1 = text_substring(PointerGetDatum(t1), 1, sp - 1, false);
1138  s2 = text_substring(PointerGetDatum(t1), sp_pl_sl, -1, true);
1139  result = text_catenate(s1, t2);
1140  result = text_catenate(result, s2);
1141 
1142  return result;
1143 }
1144 
1145 /*
1146  * textpos -
1147  * Return the position of the specified substring.
1148  * Implements the SQL POSITION() function.
1149  * Ref: A Guide To The SQL Standard, Date & Darwen, 1997
1150  * - thomas 1997-07-27
1151  */
1152 Datum
1154 {
1155  text *str = PG_GETARG_TEXT_PP(0);
1156  text *search_str = PG_GETARG_TEXT_PP(1);
1157 
1159 }
1160 
1161 /*
1162  * text_position -
1163  * Does the real work for textpos()
1164  *
1165  * Inputs:
1166  * t1 - string to be searched
1167  * t2 - pattern to match within t1
1168  * Result:
1169  * Character index of the first matched char, starting from 1,
1170  * or 0 if no match.
1171  *
1172  * This is broken out so it can be called directly by other string processing
1173  * functions.
1174  */
1175 static int
1177 {
1179  int result;
1180 
1181  /* Empty needle always matches at position 1 */
1182  if (VARSIZE_ANY_EXHDR(t2) < 1)
1183  return 1;
1184 
1185  /* Otherwise, can't match if haystack is shorter than needle */
1186  if (VARSIZE_ANY_EXHDR(t1) < VARSIZE_ANY_EXHDR(t2))
1187  return 0;
1188 
1189  text_position_setup(t1, t2, collid, &state);
1190  if (!text_position_next(&state))
1191  result = 0;
1192  else
1195  return result;
1196 }
1197 
1198 
1199 /*
1200  * text_position_setup, text_position_next, text_position_cleanup -
1201  * Component steps of text_position()
1202  *
1203  * These are broken out so that a string can be efficiently searched for
1204  * multiple occurrences of the same pattern. text_position_next may be
1205  * called multiple times, and it advances to the next match on each call.
1206  * text_position_get_match_ptr() and text_position_get_match_pos() return
1207  * a pointer or 1-based character position of the last match, respectively.
1208  *
1209  * The "state" variable is normally just a local variable in the caller.
1210  *
1211  * NOTE: text_position_next skips over the matched portion. For example,
1212  * searching for "xx" in "xxx" returns only one match, not two.
1213  */
1214 
1215 static void
1217 {
1218  int len1 = VARSIZE_ANY_EXHDR(t1);
1219  int len2 = VARSIZE_ANY_EXHDR(t2);
1220  pg_locale_t mylocale;
1221 
1223 
1224  mylocale = pg_newlocale_from_collation(collid);
1225 
1226  if (!mylocale->deterministic)
1227  ereport(ERROR,
1228  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1229  errmsg("nondeterministic collations are not supported for substring searches")));
1230 
1231  Assert(len1 > 0);
1232  Assert(len2 > 0);
1233 
1234  /*
1235  * Even with a multi-byte encoding, we perform the search using the raw
1236  * byte sequence, ignoring multibyte issues. For UTF-8, that works fine,
1237  * because in UTF-8 the byte sequence of one character cannot contain
1238  * another character. For other multi-byte encodings, we do the search
1239  * initially as a simple byte search, ignoring multibyte issues, but
1240  * verify afterwards that the match we found is at a character boundary,
1241  * and continue the search if it was a false match.
1242  */
1244  state->is_multibyte_char_in_char = false;
1245  else if (GetDatabaseEncoding() == PG_UTF8)
1246  state->is_multibyte_char_in_char = false;
1247  else
1248  state->is_multibyte_char_in_char = true;
1249 
1250  state->str1 = VARDATA_ANY(t1);
1251  state->str2 = VARDATA_ANY(t2);
1252  state->len1 = len1;
1253  state->len2 = len2;
1254  state->last_match = NULL;
1255  state->refpoint = state->str1;
1256  state->refpos = 0;
1257 
1258  /*
1259  * Prepare the skip table for Boyer-Moore-Horspool searching. In these
1260  * notes we use the terminology that the "haystack" is the string to be
1261  * searched (t1) and the "needle" is the pattern being sought (t2).
1262  *
1263  * If the needle is empty or bigger than the haystack then there is no
1264  * point in wasting cycles initializing the table. We also choose not to
1265  * use B-M-H for needles of length 1, since the skip table can't possibly
1266  * save anything in that case.
1267  */
1268  if (len1 >= len2 && len2 > 1)
1269  {
1270  int searchlength = len1 - len2;
1271  int skiptablemask;
1272  int last;
1273  int i;
1274  const char *str2 = state->str2;
1275 
1276  /*
1277  * First we must determine how much of the skip table to use. The
1278  * declaration of TextPositionState allows up to 256 elements, but for
1279  * short search problems we don't really want to have to initialize so
1280  * many elements --- it would take too long in comparison to the
1281  * actual search time. So we choose a useful skip table size based on
1282  * the haystack length minus the needle length. The closer the needle
1283  * length is to the haystack length the less useful skipping becomes.
1284  *
1285  * Note: since we use bit-masking to select table elements, the skip
1286  * table size MUST be a power of 2, and so the mask must be 2^N-1.
1287  */
1288  if (searchlength < 16)
1289  skiptablemask = 3;
1290  else if (searchlength < 64)
1291  skiptablemask = 7;
1292  else if (searchlength < 128)
1293  skiptablemask = 15;
1294  else if (searchlength < 512)
1295  skiptablemask = 31;
1296  else if (searchlength < 2048)
1297  skiptablemask = 63;
1298  else if (searchlength < 4096)
1299  skiptablemask = 127;
1300  else
1301  skiptablemask = 255;
1302  state->skiptablemask = skiptablemask;
1303 
1304  /*
1305  * Initialize the skip table. We set all elements to the needle
1306  * length, since this is the correct skip distance for any character
1307  * not found in the needle.
1308  */
1309  for (i = 0; i <= skiptablemask; i++)
1310  state->skiptable[i] = len2;
1311 
1312  /*
1313  * Now examine the needle. For each character except the last one,
1314  * set the corresponding table element to the appropriate skip
1315  * distance. Note that when two characters share the same skip table
1316  * entry, the one later in the needle must determine the skip
1317  * distance.
1318  */
1319  last = len2 - 1;
1320 
1321  for (i = 0; i < last; i++)
1322  state->skiptable[(unsigned char) str2[i] & skiptablemask] = last - i;
1323  }
1324 }
1325 
1326 /*
1327  * Advance to the next match, starting from the end of the previous match
1328  * (or the beginning of the string, on first call). Returns true if a match
1329  * is found.
1330  *
1331  * Note that this refuses to match an empty-string needle. Most callers
1332  * will have handled that case specially and we'll never see it here.
1333  */
1334 static bool
1336 {
1337  int needle_len = state->len2;
1338  char *start_ptr;
1339  char *matchptr;
1340 
1341  if (needle_len <= 0)
1342  return false; /* result for empty pattern */
1343 
1344  /* Start from the point right after the previous match. */
1345  if (state->last_match)
1346  start_ptr = state->last_match + needle_len;
1347  else
1348  start_ptr = state->str1;
1349 
1350 retry:
1351  matchptr = text_position_next_internal(start_ptr, state);
1352 
1353  if (!matchptr)
1354  return false;
1355 
1356  /*
1357  * Found a match for the byte sequence. If this is a multibyte encoding,
1358  * where one character's byte sequence can appear inside a longer
1359  * multi-byte character, we need to verify that the match was at a
1360  * character boundary, not in the middle of a multi-byte character.
1361  */
1362  if (state->is_multibyte_char_in_char)
1363  {
1364  /* Walk one character at a time, until we reach the match. */
1365 
1366  /* the search should never move backwards. */
1367  Assert(state->refpoint <= matchptr);
1368 
1369  while (state->refpoint < matchptr)
1370  {
1371  /* step to next character. */
1372  state->refpoint += pg_mblen(state->refpoint);
1373  state->refpos++;
1374 
1375  /*
1376  * If we stepped over the match's start position, then it was a
1377  * false positive, where the byte sequence appeared in the middle
1378  * of a multi-byte character. Skip it, and continue the search at
1379  * the next character boundary.
1380  */
1381  if (state->refpoint > matchptr)
1382  {
1383  start_ptr = state->refpoint;
1384  goto retry;
1385  }
1386  }
1387  }
1388 
1389  state->last_match = matchptr;
1390  return true;
1391 }
1392 
1393 /*
1394  * Subroutine of text_position_next(). This searches for the raw byte
1395  * sequence, ignoring any multi-byte encoding issues. Returns the first
1396  * match starting at 'start_ptr', or NULL if no match is found.
1397  */
1398 static char *
1400 {
1401  int haystack_len = state->len1;
1402  int needle_len = state->len2;
1403  int skiptablemask = state->skiptablemask;
1404  const char *haystack = state->str1;
1405  const char *needle = state->str2;
1406  const char *haystack_end = &haystack[haystack_len];
1407  const char *hptr;
1408 
1409  Assert(start_ptr >= haystack && start_ptr <= haystack_end);
1410 
1411  if (needle_len == 1)
1412  {
1413  /* No point in using B-M-H for a one-character needle */
1414  char nchar = *needle;
1415 
1416  hptr = start_ptr;
1417  while (hptr < haystack_end)
1418  {
1419  if (*hptr == nchar)
1420  return (char *) hptr;
1421  hptr++;
1422  }
1423  }
1424  else
1425  {
1426  const char *needle_last = &needle[needle_len - 1];
1427 
1428  /* Start at startpos plus the length of the needle */
1429  hptr = start_ptr + needle_len - 1;
1430  while (hptr < haystack_end)
1431  {
1432  /* Match the needle scanning *backward* */
1433  const char *nptr;
1434  const char *p;
1435 
1436  nptr = needle_last;
1437  p = hptr;
1438  while (*nptr == *p)
1439  {
1440  /* Matched it all? If so, return 1-based position */
1441  if (nptr == needle)
1442  return (char *) p;
1443  nptr--, p--;
1444  }
1445 
1446  /*
1447  * No match, so use the haystack char at hptr to decide how far to
1448  * advance. If the needle had any occurrence of that character
1449  * (or more precisely, one sharing the same skiptable entry)
1450  * before its last character, then we advance far enough to align
1451  * the last such needle character with that haystack position.
1452  * Otherwise we can advance by the whole needle length.
1453  */
1454  hptr += state->skiptable[(unsigned char) *hptr & skiptablemask];
1455  }
1456  }
1457 
1458  return 0; /* not found */
1459 }
1460 
1461 /*
1462  * Return a pointer to the current match.
1463  *
1464  * The returned pointer points into the original haystack string.
1465  */
1466 static char *
1468 {
1469  return state->last_match;
1470 }
1471 
1472 /*
1473  * Return the offset of the current match.
1474  *
1475  * The offset is in characters, 1-based.
1476  */
1477 static int
1479 {
1480  /* Convert the byte position to char position. */
1481  state->refpos += pg_mbstrlen_with_len(state->refpoint,
1482  state->last_match - state->refpoint);
1483  state->refpoint = state->last_match;
1484  return state->refpos + 1;
1485 }
1486 
1487 /*
1488  * Reset search state to the initial state installed by text_position_setup.
1489  *
1490  * The next call to text_position_next will search from the beginning
1491  * of the string.
1492  */
1493 static void
1495 {
1496  state->last_match = NULL;
1497  state->refpoint = state->str1;
1498  state->refpos = 0;
1499 }
1500 
1501 static void
1503 {
1504  /* no cleanup needed */
1505 }
1506 
1507 
1508 static void
1510 {
1511  if (!OidIsValid(collid))
1512  {
1513  /*
1514  * This typically means that the parser could not resolve a conflict
1515  * of implicit collations, so report it that way.
1516  */
1517  ereport(ERROR,
1518  (errcode(ERRCODE_INDETERMINATE_COLLATION),
1519  errmsg("could not determine which collation to use for string comparison"),
1520  errhint("Use the COLLATE clause to set the collation explicitly.")));
1521  }
1522 }
1523 
1524 /*
1525  * varstr_cmp()
1526  *
1527  * Comparison function for text strings with given lengths, using the
1528  * appropriate locale. Returns an integer less than, equal to, or greater than
1529  * zero, indicating whether arg1 is less than, equal to, or greater than arg2.
1530  *
1531  * Note: many functions that depend on this are marked leakproof; therefore,
1532  * avoid reporting the actual contents of the input when throwing errors.
1533  * All errors herein should be things that can't happen except on corrupt
1534  * data, anyway; otherwise we will have trouble with indexing strings that
1535  * would cause them.
1536  */
1537 int
1538 varstr_cmp(const char *arg1, int len1, const char *arg2, int len2, Oid collid)
1539 {
1540  int result;
1541  pg_locale_t mylocale;
1542 
1544 
1545  mylocale = pg_newlocale_from_collation(collid);
1546 
1547  if (mylocale->collate_is_c)
1548  {
1549  result = memcmp(arg1, arg2, Min(len1, len2));
1550  if ((result == 0) && (len1 != len2))
1551  result = (len1 < len2) ? -1 : 1;
1552  }
1553  else
1554  {
1555  /*
1556  * memcmp() can't tell us which of two unequal strings sorts first,
1557  * but it's a cheap way to tell if they're equal. Testing shows that
1558  * memcmp() followed by strcoll() is only trivially slower than
1559  * strcoll() by itself, so we don't lose much if this doesn't work out
1560  * very often, and if it does - for example, because there are many
1561  * equal strings in the input - then we win big by avoiding expensive
1562  * collation-aware comparisons.
1563  */
1564  if (len1 == len2 && memcmp(arg1, arg2, len1) == 0)
1565  return 0;
1566 
1567  result = pg_strncoll(arg1, len1, arg2, len2, mylocale);
1568 
1569  /* Break tie if necessary. */
1570  if (result == 0 && mylocale->deterministic)
1571  {
1572  result = memcmp(arg1, arg2, Min(len1, len2));
1573  if ((result == 0) && (len1 != len2))
1574  result = (len1 < len2) ? -1 : 1;
1575  }
1576  }
1577 
1578  return result;
1579 }
1580 
1581 /* text_cmp()
1582  * Internal comparison function for text strings.
1583  * Returns -1, 0 or 1
1584  */
1585 static int
1586 text_cmp(text *arg1, text *arg2, Oid collid)
1587 {
1588  char *a1p,
1589  *a2p;
1590  int len1,
1591  len2;
1592 
1593  a1p = VARDATA_ANY(arg1);
1594  a2p = VARDATA_ANY(arg2);
1595 
1596  len1 = VARSIZE_ANY_EXHDR(arg1);
1597  len2 = VARSIZE_ANY_EXHDR(arg2);
1598 
1599  return varstr_cmp(a1p, len1, a2p, len2, collid);
1600 }
1601 
1602 /*
1603  * Comparison functions for text strings.
1604  *
1605  * Note: btree indexes need these routines not to leak memory; therefore,
1606  * be careful to free working copies of toasted datums. Most places don't
1607  * need to be so careful.
1608  */
1609 
1610 Datum
1612 {
1614  pg_locale_t mylocale = 0;
1615  bool result;
1616 
1618 
1619  mylocale = pg_newlocale_from_collation(collid);
1620 
1621  if (mylocale->deterministic)
1622  {
1623  Datum arg1 = PG_GETARG_DATUM(0);
1624  Datum arg2 = PG_GETARG_DATUM(1);
1625  Size len1,
1626  len2;
1627 
1628  /*
1629  * Since we only care about equality or not-equality, we can avoid all
1630  * the expense of strcoll() here, and just do bitwise comparison. In
1631  * fact, we don't even have to do a bitwise comparison if we can show
1632  * the lengths of the strings are unequal; which might save us from
1633  * having to detoast one or both values.
1634  */
1635  len1 = toast_raw_datum_size(arg1);
1636  len2 = toast_raw_datum_size(arg2);
1637  if (len1 != len2)
1638  result = false;
1639  else
1640  {
1641  text *targ1 = DatumGetTextPP(arg1);
1642  text *targ2 = DatumGetTextPP(arg2);
1643 
1644  result = (memcmp(VARDATA_ANY(targ1), VARDATA_ANY(targ2),
1645  len1 - VARHDRSZ) == 0);
1646 
1647  PG_FREE_IF_COPY(targ1, 0);
1648  PG_FREE_IF_COPY(targ2, 1);
1649  }
1650  }
1651  else
1652  {
1653  text *arg1 = PG_GETARG_TEXT_PP(0);
1654  text *arg2 = PG_GETARG_TEXT_PP(1);
1655 
1656  result = (text_cmp(arg1, arg2, collid) == 0);
1657 
1658  PG_FREE_IF_COPY(arg1, 0);
1659  PG_FREE_IF_COPY(arg2, 1);
1660  }
1661 
1662  PG_RETURN_BOOL(result);
1663 }
1664 
1665 Datum
1667 {
1669  pg_locale_t mylocale;
1670  bool result;
1671 
1673 
1674  mylocale = pg_newlocale_from_collation(collid);
1675 
1676  if (mylocale->deterministic)
1677  {
1678  Datum arg1 = PG_GETARG_DATUM(0);
1679  Datum arg2 = PG_GETARG_DATUM(1);
1680  Size len1,
1681  len2;
1682 
1683  /* See comment in texteq() */
1684  len1 = toast_raw_datum_size(arg1);
1685  len2 = toast_raw_datum_size(arg2);
1686  if (len1 != len2)
1687  result = true;
1688  else
1689  {
1690  text *targ1 = DatumGetTextPP(arg1);
1691  text *targ2 = DatumGetTextPP(arg2);
1692 
1693  result = (memcmp(VARDATA_ANY(targ1), VARDATA_ANY(targ2),
1694  len1 - VARHDRSZ) != 0);
1695 
1696  PG_FREE_IF_COPY(targ1, 0);
1697  PG_FREE_IF_COPY(targ2, 1);
1698  }
1699  }
1700  else
1701  {
1702  text *arg1 = PG_GETARG_TEXT_PP(0);
1703  text *arg2 = PG_GETARG_TEXT_PP(1);
1704 
1705  result = (text_cmp(arg1, arg2, collid) != 0);
1706 
1707  PG_FREE_IF_COPY(arg1, 0);
1708  PG_FREE_IF_COPY(arg2, 1);
1709  }
1710 
1711  PG_RETURN_BOOL(result);
1712 }
1713 
1714 Datum
1716 {
1717  text *arg1 = PG_GETARG_TEXT_PP(0);
1718  text *arg2 = PG_GETARG_TEXT_PP(1);
1719  bool result;
1720 
1721  result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) < 0);
1722 
1723  PG_FREE_IF_COPY(arg1, 0);
1724  PG_FREE_IF_COPY(arg2, 1);
1725 
1726  PG_RETURN_BOOL(result);
1727 }
1728 
1729 Datum
1731 {
1732  text *arg1 = PG_GETARG_TEXT_PP(0);
1733  text *arg2 = PG_GETARG_TEXT_PP(1);
1734  bool result;
1735 
1736  result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) <= 0);
1737 
1738  PG_FREE_IF_COPY(arg1, 0);
1739  PG_FREE_IF_COPY(arg2, 1);
1740 
1741  PG_RETURN_BOOL(result);
1742 }
1743 
1744 Datum
1746 {
1747  text *arg1 = PG_GETARG_TEXT_PP(0);
1748  text *arg2 = PG_GETARG_TEXT_PP(1);
1749  bool result;
1750 
1751  result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) > 0);
1752 
1753  PG_FREE_IF_COPY(arg1, 0);
1754  PG_FREE_IF_COPY(arg2, 1);
1755 
1756  PG_RETURN_BOOL(result);
1757 }
1758 
1759 Datum
1761 {
1762  text *arg1 = PG_GETARG_TEXT_PP(0);
1763  text *arg2 = PG_GETARG_TEXT_PP(1);
1764  bool result;
1765 
1766  result = (text_cmp(arg1, arg2, PG_GET_COLLATION()) >= 0);
1767 
1768  PG_FREE_IF_COPY(arg1, 0);
1769  PG_FREE_IF_COPY(arg2, 1);
1770 
1771  PG_RETURN_BOOL(result);
1772 }
1773 
1774 Datum
1776 {
1777  Datum arg1 = PG_GETARG_DATUM(0);
1778  Datum arg2 = PG_GETARG_DATUM(1);
1780  pg_locale_t mylocale;
1781  bool result;
1782  Size len1,
1783  len2;
1784 
1786 
1787  mylocale = pg_newlocale_from_collation(collid);
1788 
1789  if (!mylocale->deterministic)
1790  ereport(ERROR,
1791  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1792  errmsg("nondeterministic collations are not supported for substring searches")));
1793 
1794  len1 = toast_raw_datum_size(arg1);
1795  len2 = toast_raw_datum_size(arg2);
1796  if (len2 > len1)
1797  result = false;
1798  else
1799  {
1800  text *targ1 = text_substring(arg1, 1, len2, false);
1801  text *targ2 = DatumGetTextPP(arg2);
1802 
1803  result = (memcmp(VARDATA_ANY(targ1), VARDATA_ANY(targ2),
1804  VARSIZE_ANY_EXHDR(targ2)) == 0);
1805 
1806  PG_FREE_IF_COPY(targ1, 0);
1807  PG_FREE_IF_COPY(targ2, 1);
1808  }
1809 
1810  PG_RETURN_BOOL(result);
1811 }
1812 
1813 Datum
1815 {
1816  text *arg1 = PG_GETARG_TEXT_PP(0);
1817  text *arg2 = PG_GETARG_TEXT_PP(1);
1818  int32 result;
1819 
1820  result = text_cmp(arg1, arg2, PG_GET_COLLATION());
1821 
1822  PG_FREE_IF_COPY(arg1, 0);
1823  PG_FREE_IF_COPY(arg2, 1);
1824 
1825  PG_RETURN_INT32(result);
1826 }
1827 
1828 Datum
1830 {
1832  Oid collid = ssup->ssup_collation;
1833  MemoryContext oldcontext;
1834 
1835  oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
1836 
1837  /* Use generic string SortSupport */
1838  varstr_sortsupport(ssup, TEXTOID, collid);
1839 
1840  MemoryContextSwitchTo(oldcontext);
1841 
1842  PG_RETURN_VOID();
1843 }
1844 
1845 /*
1846  * Generic sortsupport interface for character type's operator classes.
1847  * Includes locale support, and support for BpChar semantics (i.e. removing
1848  * trailing spaces before comparison).
1849  *
1850  * Relies on the assumption that text, VarChar, BpChar, and bytea all have the
1851  * same representation. Callers that always use the C collation (e.g.
1852  * non-collatable type callers like bytea) may have NUL bytes in their strings;
1853  * this will not work with any other collation, though.
1854  */
1855 void
1857 {
1858  bool abbreviate = ssup->abbreviate;
1859  bool collate_c = false;
1860  VarStringSortSupport *sss;
1862 
1864 
1866 
1867  /*
1868  * If possible, set ssup->comparator to a function which can be used to
1869  * directly compare two datums. If we can do this, we'll avoid the
1870  * overhead of a trip through the fmgr layer for every comparison, which
1871  * can be substantial.
1872  *
1873  * Most typically, we'll set the comparator to varlenafastcmp_locale,
1874  * which uses strcoll() to perform comparisons. We use that for the
1875  * BpChar case too, but type NAME uses namefastcmp_locale. However, if
1876  * LC_COLLATE = C, we can make things quite a bit faster with
1877  * varstrfastcmp_c, bpcharfastcmp_c, or namefastcmp_c, all of which use
1878  * memcmp() rather than strcoll().
1879  */
1880  if (locale->collate_is_c)
1881  {
1882  if (typid == BPCHAROID)
1883  ssup->comparator = bpcharfastcmp_c;
1884  else if (typid == NAMEOID)
1885  {
1886  ssup->comparator = namefastcmp_c;
1887  /* Not supporting abbreviation with type NAME, for now */
1888  abbreviate = false;
1889  }
1890  else
1891  ssup->comparator = varstrfastcmp_c;
1892 
1893  collate_c = true;
1894  }
1895  else
1896  {
1897  /*
1898  * We use varlenafastcmp_locale except for type NAME.
1899  */
1900  if (typid == NAMEOID)
1901  {
1903  /* Not supporting abbreviation with type NAME, for now */
1904  abbreviate = false;
1905  }
1906  else
1908 
1909  /*
1910  * Unfortunately, it seems that abbreviation for non-C collations is
1911  * broken on many common platforms; see pg_strxfrm_enabled().
1912  *
1913  * Even apart from the risk of broken locales, it's possible that
1914  * there are platforms where the use of abbreviated keys should be
1915  * disabled at compile time. Having only 4 byte datums could make
1916  * worst-case performance drastically more likely, for example.
1917  * Moreover, macOS's strxfrm() implementation is known to not
1918  * effectively concentrate a significant amount of entropy from the
1919  * original string in earlier transformed blobs. It's possible that
1920  * other supported platforms are similarly encumbered. So, if we ever
1921  * get past disabling this categorically, we may still want or need to
1922  * disable it for particular platforms.
1923  */
1924  if (!pg_strxfrm_enabled(locale))
1925  abbreviate = false;
1926  }
1927 
1928  /*
1929  * If we're using abbreviated keys, or if we're using a locale-aware
1930  * comparison, we need to initialize a VarStringSortSupport object. Both
1931  * cases will make use of the temporary buffers we initialize here for
1932  * scratch space (and to detect requirement for BpChar semantics from
1933  * caller), and the abbreviation case requires additional state.
1934  */
1935  if (abbreviate || !collate_c)
1936  {
1937  sss = palloc(sizeof(VarStringSortSupport));
1938  sss->buf1 = palloc(TEXTBUFLEN);
1939  sss->buflen1 = TEXTBUFLEN;
1940  sss->buf2 = palloc(TEXTBUFLEN);
1941  sss->buflen2 = TEXTBUFLEN;
1942  /* Start with invalid values */
1943  sss->last_len1 = -1;
1944  sss->last_len2 = -1;
1945  /* Initialize */
1946  sss->last_returned = 0;
1947  if (collate_c)
1948  sss->locale = NULL;
1949  else
1950  sss->locale = locale;
1951 
1952  /*
1953  * To avoid somehow confusing a strxfrm() blob and an original string,
1954  * constantly keep track of the variety of data that buf1 and buf2
1955  * currently contain.
1956  *
1957  * Comparisons may be interleaved with conversion calls. Frequently,
1958  * conversions and comparisons are batched into two distinct phases,
1959  * but the correctness of caching cannot hinge upon this. For
1960  * comparison caching, buffer state is only trusted if cache_blob is
1961  * found set to false, whereas strxfrm() caching only trusts the state
1962  * when cache_blob is found set to true.
1963  *
1964  * Arbitrarily initialize cache_blob to true.
1965  */
1966  sss->cache_blob = true;
1967  sss->collate_c = collate_c;
1968  sss->typid = typid;
1969  ssup->ssup_extra = sss;
1970 
1971  /*
1972  * If possible, plan to use the abbreviated keys optimization. The
1973  * core code may switch back to authoritative comparator should
1974  * abbreviation be aborted.
1975  */
1976  if (abbreviate)
1977  {
1978  sss->prop_card = 0.20;
1979  initHyperLogLog(&sss->abbr_card, 10);
1980  initHyperLogLog(&sss->full_card, 10);
1981  ssup->abbrev_full_comparator = ssup->comparator;
1985  }
1986  }
1987 }
1988 
1989 /*
1990  * sortsupport comparison func (for C locale case)
1991  */
1992 static int
1994 {
1995  VarString *arg1 = DatumGetVarStringPP(x);
1996  VarString *arg2 = DatumGetVarStringPP(y);
1997  char *a1p,
1998  *a2p;
1999  int len1,
2000  len2,
2001  result;
2002 
2003  a1p = VARDATA_ANY(arg1);
2004  a2p = VARDATA_ANY(arg2);
2005 
2006  len1 = VARSIZE_ANY_EXHDR(arg1);
2007  len2 = VARSIZE_ANY_EXHDR(arg2);
2008 
2009  result = memcmp(a1p, a2p, Min(len1, len2));
2010  if ((result == 0) && (len1 != len2))
2011  result = (len1 < len2) ? -1 : 1;
2012 
2013  /* We can't afford to leak memory here. */
2014  if (PointerGetDatum(arg1) != x)
2015  pfree(arg1);
2016  if (PointerGetDatum(arg2) != y)
2017  pfree(arg2);
2018 
2019  return result;
2020 }
2021 
2022 /*
2023  * sortsupport comparison func (for BpChar C locale case)
2024  *
2025  * BpChar outsources its sortsupport to this module. Specialization for the
2026  * varstr_sortsupport BpChar case, modeled on
2027  * internal_bpchar_pattern_compare().
2028  */
2029 static int
2031 {
2032  BpChar *arg1 = DatumGetBpCharPP(x);
2033  BpChar *arg2 = DatumGetBpCharPP(y);
2034  char *a1p,
2035  *a2p;
2036  int len1,
2037  len2,
2038  result;
2039 
2040  a1p = VARDATA_ANY(arg1);
2041  a2p = VARDATA_ANY(arg2);
2042 
2043  len1 = bpchartruelen(a1p, VARSIZE_ANY_EXHDR(arg1));
2044  len2 = bpchartruelen(a2p, VARSIZE_ANY_EXHDR(arg2));
2045 
2046  result = memcmp(a1p, a2p, Min(len1, len2));
2047  if ((result == 0) && (len1 != len2))
2048  result = (len1 < len2) ? -1 : 1;
2049 
2050  /* We can't afford to leak memory here. */
2051  if (PointerGetDatum(arg1) != x)
2052  pfree(arg1);
2053  if (PointerGetDatum(arg2) != y)
2054  pfree(arg2);
2055 
2056  return result;
2057 }
2058 
2059 /*
2060  * sortsupport comparison func (for NAME C locale case)
2061  */
2062 static int
2064 {
2065  Name arg1 = DatumGetName(x);
2066  Name arg2 = DatumGetName(y);
2067 
2068  return strncmp(NameStr(*arg1), NameStr(*arg2), NAMEDATALEN);
2069 }
2070 
2071 /*
2072  * sortsupport comparison func (for locale case with all varlena types)
2073  */
2074 static int
2076 {
2077  VarString *arg1 = DatumGetVarStringPP(x);
2078  VarString *arg2 = DatumGetVarStringPP(y);
2079  char *a1p,
2080  *a2p;
2081  int len1,
2082  len2,
2083  result;
2084 
2085  a1p = VARDATA_ANY(arg1);
2086  a2p = VARDATA_ANY(arg2);
2087 
2088  len1 = VARSIZE_ANY_EXHDR(arg1);
2089  len2 = VARSIZE_ANY_EXHDR(arg2);
2090 
2091  result = varstrfastcmp_locale(a1p, len1, a2p, len2, ssup);
2092 
2093  /* We can't afford to leak memory here. */
2094  if (PointerGetDatum(arg1) != x)
2095  pfree(arg1);
2096  if (PointerGetDatum(arg2) != y)
2097  pfree(arg2);
2098 
2099  return result;
2100 }
2101 
2102 /*
2103  * sortsupport comparison func (for locale case with NAME type)
2104  */
2105 static int
2107 {
2108  Name arg1 = DatumGetName(x);
2109  Name arg2 = DatumGetName(y);
2110 
2111  return varstrfastcmp_locale(NameStr(*arg1), strlen(NameStr(*arg1)),
2112  NameStr(*arg2), strlen(NameStr(*arg2)),
2113  ssup);
2114 }
2115 
2116 /*
2117  * sortsupport comparison func for locale cases
2118  */
2119 static int
2120 varstrfastcmp_locale(char *a1p, int len1, char *a2p, int len2, SortSupport ssup)
2121 {
2123  int result;
2124  bool arg1_match;
2125 
2126  /* Fast pre-check for equality, as discussed in varstr_cmp() */
2127  if (len1 == len2 && memcmp(a1p, a2p, len1) == 0)
2128  {
2129  /*
2130  * No change in buf1 or buf2 contents, so avoid changing last_len1 or
2131  * last_len2. Existing contents of buffers might still be used by
2132  * next call.
2133  *
2134  * It's fine to allow the comparison of BpChar padding bytes here,
2135  * even though that implies that the memcmp() will usually be
2136  * performed for BpChar callers (though multibyte characters could
2137  * still prevent that from occurring). The memcmp() is still very
2138  * cheap, and BpChar's funny semantics have us remove trailing spaces
2139  * (not limited to padding), so we need make no distinction between
2140  * padding space characters and "real" space characters.
2141  */
2142  return 0;
2143  }
2144 
2145  if (sss->typid == BPCHAROID)
2146  {
2147  /* Get true number of bytes, ignoring trailing spaces */
2148  len1 = bpchartruelen(a1p, len1);
2149  len2 = bpchartruelen(a2p, len2);
2150  }
2151 
2152  if (len1 >= sss->buflen1)
2153  {
2154  sss->buflen1 = Max(len1 + 1, Min(sss->buflen1 * 2, MaxAllocSize));
2155  sss->buf1 = repalloc(sss->buf1, sss->buflen1);
2156  }
2157  if (len2 >= sss->buflen2)
2158  {
2159  sss->buflen2 = Max(len2 + 1, Min(sss->buflen2 * 2, MaxAllocSize));
2160  sss->buf2 = repalloc(sss->buf2, sss->buflen2);
2161  }
2162 
2163  /*
2164  * We're likely to be asked to compare the same strings repeatedly, and
2165  * memcmp() is so much cheaper than strcoll() that it pays to try to cache
2166  * comparisons, even though in general there is no reason to think that
2167  * that will work out (every string datum may be unique). Caching does
2168  * not slow things down measurably when it doesn't work out, and can speed
2169  * things up by rather a lot when it does. In part, this is because the
2170  * memcmp() compares data from cachelines that are needed in L1 cache even
2171  * when the last comparison's result cannot be reused.
2172  */
2173  arg1_match = true;
2174  if (len1 != sss->last_len1 || memcmp(sss->buf1, a1p, len1) != 0)
2175  {
2176  arg1_match = false;
2177  memcpy(sss->buf1, a1p, len1);
2178  sss->buf1[len1] = '\0';
2179  sss->last_len1 = len1;
2180  }
2181 
2182  /*
2183  * If we're comparing the same two strings as last time, we can return the
2184  * same answer without calling strcoll() again. This is more likely than
2185  * it seems (at least with moderate to low cardinality sets), because
2186  * quicksort compares the same pivot against many values.
2187  */
2188  if (len2 != sss->last_len2 || memcmp(sss->buf2, a2p, len2) != 0)
2189  {
2190  memcpy(sss->buf2, a2p, len2);
2191  sss->buf2[len2] = '\0';
2192  sss->last_len2 = len2;
2193  }
2194  else if (arg1_match && !sss->cache_blob)
2195  {
2196  /* Use result cached following last actual strcoll() call */
2197  return sss->last_returned;
2198  }
2199 
2200  result = pg_strcoll(sss->buf1, sss->buf2, sss->locale);
2201 
2202  /* Break tie if necessary. */
2203  if (result == 0 && sss->locale->deterministic)
2204  result = strcmp(sss->buf1, sss->buf2);
2205 
2206  /* Cache result, perhaps saving an expensive strcoll() call next time */
2207  sss->cache_blob = false;
2208  sss->last_returned = result;
2209  return result;
2210 }
2211 
2212 /*
2213  * Conversion routine for sortsupport. Converts original to abbreviated key
2214  * representation. Our encoding strategy is simple -- pack the first 8 bytes
2215  * of a strxfrm() blob into a Datum (on little-endian machines, the 8 bytes are
2216  * stored in reverse order), and treat it as an unsigned integer. When the "C"
2217  * locale is used, or in case of bytea, just memcpy() from original instead.
2218  */
2219 static Datum
2221 {
2222  const size_t max_prefix_bytes = sizeof(Datum);
2224  VarString *authoritative = DatumGetVarStringPP(original);
2225  char *authoritative_data = VARDATA_ANY(authoritative);
2226 
2227  /* working state */
2228  Datum res;
2229  char *pres;
2230  int len;
2231  uint32 hash;
2232 
2233  pres = (char *) &res;
2234  /* memset(), so any non-overwritten bytes are NUL */
2235  memset(pres, 0, max_prefix_bytes);
2236  len = VARSIZE_ANY_EXHDR(authoritative);
2237 
2238  /* Get number of bytes, ignoring trailing spaces */
2239  if (sss->typid == BPCHAROID)
2240  len = bpchartruelen(authoritative_data, len);
2241 
2242  /*
2243  * If we're using the C collation, use memcpy(), rather than strxfrm(), to
2244  * abbreviate keys. The full comparator for the C locale is always
2245  * memcmp(). It would be incorrect to allow bytea callers (callers that
2246  * always force the C collation -- bytea isn't a collatable type, but this
2247  * approach is convenient) to use strxfrm(). This is because bytea
2248  * strings may contain NUL bytes. Besides, this should be faster, too.
2249  *
2250  * More generally, it's okay that bytea callers can have NUL bytes in
2251  * strings because abbreviated cmp need not make a distinction between
2252  * terminating NUL bytes, and NUL bytes representing actual NULs in the
2253  * authoritative representation. Hopefully a comparison at or past one
2254  * abbreviated key's terminating NUL byte will resolve the comparison
2255  * without consulting the authoritative representation; specifically, some
2256  * later non-NUL byte in the longer string can resolve the comparison
2257  * against a subsequent terminating NUL in the shorter string. There will
2258  * usually be what is effectively a "length-wise" resolution there and
2259  * then.
2260  *
2261  * If that doesn't work out -- if all bytes in the longer string
2262  * positioned at or past the offset of the smaller string's (first)
2263  * terminating NUL are actually representative of NUL bytes in the
2264  * authoritative binary string (perhaps with some *terminating* NUL bytes
2265  * towards the end of the longer string iff it happens to still be small)
2266  * -- then an authoritative tie-breaker will happen, and do the right
2267  * thing: explicitly consider string length.
2268  */
2269  if (sss->collate_c)
2270  memcpy(pres, authoritative_data, Min(len, max_prefix_bytes));
2271  else
2272  {
2273  Size bsize;
2274 
2275  /*
2276  * We're not using the C collation, so fall back on strxfrm or ICU
2277  * analogs.
2278  */
2279 
2280  /* By convention, we use buffer 1 to store and NUL-terminate */
2281  if (len >= sss->buflen1)
2282  {
2283  sss->buflen1 = Max(len + 1, Min(sss->buflen1 * 2, MaxAllocSize));
2284  sss->buf1 = repalloc(sss->buf1, sss->buflen1);
2285  }
2286 
2287  /* Might be able to reuse strxfrm() blob from last call */
2288  if (sss->last_len1 == len && sss->cache_blob &&
2289  memcmp(sss->buf1, authoritative_data, len) == 0)
2290  {
2291  memcpy(pres, sss->buf2, Min(max_prefix_bytes, sss->last_len2));
2292  /* No change affecting cardinality, so no hashing required */
2293  goto done;
2294  }
2295 
2296  memcpy(sss->buf1, authoritative_data, len);
2297 
2298  /*
2299  * pg_strxfrm() and pg_strxfrm_prefix expect NUL-terminated strings.
2300  */
2301  sss->buf1[len] = '\0';
2302  sss->last_len1 = len;
2303 
2305  {
2306  if (sss->buflen2 < max_prefix_bytes)
2307  {
2308  sss->buflen2 = Max(max_prefix_bytes,
2309  Min(sss->buflen2 * 2, MaxAllocSize));
2310  sss->buf2 = repalloc(sss->buf2, sss->buflen2);
2311  }
2312 
2313  bsize = pg_strxfrm_prefix(sss->buf2, sss->buf1,
2314  max_prefix_bytes, sss->locale);
2315  sss->last_len2 = bsize;
2316  }
2317  else
2318  {
2319  /*
2320  * Loop: Call pg_strxfrm(), possibly enlarge buffer, and try
2321  * again. The pg_strxfrm() function leaves the result buffer
2322  * content undefined if the result did not fit, so we need to
2323  * retry until everything fits, even though we only need the first
2324  * few bytes in the end.
2325  */
2326  for (;;)
2327  {
2328  bsize = pg_strxfrm(sss->buf2, sss->buf1, sss->buflen2,
2329  sss->locale);
2330 
2331  sss->last_len2 = bsize;
2332  if (bsize < sss->buflen2)
2333  break;
2334 
2335  /*
2336  * Grow buffer and retry.
2337  */
2338  sss->buflen2 = Max(bsize + 1,
2339  Min(sss->buflen2 * 2, MaxAllocSize));
2340  sss->buf2 = repalloc(sss->buf2, sss->buflen2);
2341  }
2342  }
2343 
2344  /*
2345  * Every Datum byte is always compared. This is safe because the
2346  * strxfrm() blob is itself NUL terminated, leaving no danger of
2347  * misinterpreting any NUL bytes not intended to be interpreted as
2348  * logically representing termination.
2349  *
2350  * (Actually, even if there were NUL bytes in the blob it would be
2351  * okay. See remarks on bytea case above.)
2352  */
2353  memcpy(pres, sss->buf2, Min(max_prefix_bytes, bsize));
2354  }
2355 
2356  /*
2357  * Maintain approximate cardinality of both abbreviated keys and original,
2358  * authoritative keys using HyperLogLog. Used as cheap insurance against
2359  * the worst case, where we do many string transformations for no saving
2360  * in full strcoll()-based comparisons. These statistics are used by
2361  * varstr_abbrev_abort().
2362  *
2363  * First, Hash key proper, or a significant fraction of it. Mix in length
2364  * in order to compensate for cases where differences are past
2365  * PG_CACHE_LINE_SIZE bytes, so as to limit the overhead of hashing.
2366  */
2367  hash = DatumGetUInt32(hash_any((unsigned char *) authoritative_data,
2369 
2370  if (len > PG_CACHE_LINE_SIZE)
2372 
2373  addHyperLogLog(&sss->full_card, hash);
2374 
2375  /* Hash abbreviated key */
2376 #if SIZEOF_DATUM == 8
2377  {
2378  uint32 lohalf,
2379  hihalf;
2380 
2381  lohalf = (uint32) res;
2382  hihalf = (uint32) (res >> 32);
2383  hash = DatumGetUInt32(hash_uint32(lohalf ^ hihalf));
2384  }
2385 #else /* SIZEOF_DATUM != 8 */
2387 #endif
2388 
2389  addHyperLogLog(&sss->abbr_card, hash);
2390 
2391  /* Cache result, perhaps saving an expensive strxfrm() call next time */
2392  sss->cache_blob = true;
2393 done:
2394 
2395  /*
2396  * Byteswap on little-endian machines.
2397  *
2398  * This is needed so that ssup_datum_unsigned_cmp() (an unsigned integer
2399  * 3-way comparator) works correctly on all platforms. If we didn't do
2400  * this, the comparator would have to call memcmp() with a pair of
2401  * pointers to the first byte of each abbreviated key, which is slower.
2402  */
2403  res = DatumBigEndianToNative(res);
2404 
2405  /* Don't leak memory here */
2406  if (PointerGetDatum(authoritative) != original)
2407  pfree(authoritative);
2408 
2409  return res;
2410 }
2411 
2412 /*
2413  * Callback for estimating effectiveness of abbreviated key optimization, using
2414  * heuristic rules. Returns value indicating if the abbreviation optimization
2415  * should be aborted, based on its projected effectiveness.
2416  */
2417 static bool
2418 varstr_abbrev_abort(int memtupcount, SortSupport ssup)
2419 {
2421  double abbrev_distinct,
2422  key_distinct;
2423 
2424  Assert(ssup->abbreviate);
2425 
2426  /* Have a little patience */
2427  if (memtupcount < 100)
2428  return false;
2429 
2430  abbrev_distinct = estimateHyperLogLog(&sss->abbr_card);
2431  key_distinct = estimateHyperLogLog(&sss->full_card);
2432 
2433  /*
2434  * Clamp cardinality estimates to at least one distinct value. While
2435  * NULLs are generally disregarded, if only NULL values were seen so far,
2436  * that might misrepresent costs if we failed to clamp.
2437  */
2438  if (abbrev_distinct <= 1.0)
2439  abbrev_distinct = 1.0;
2440 
2441  if (key_distinct <= 1.0)
2442  key_distinct = 1.0;
2443 
2444  /*
2445  * In the worst case all abbreviated keys are identical, while at the same
2446  * time there are differences within full key strings not captured in
2447  * abbreviations.
2448  */
2449  if (trace_sort)
2450  {
2451  double norm_abbrev_card = abbrev_distinct / (double) memtupcount;
2452 
2453  elog(LOG, "varstr_abbrev: abbrev_distinct after %d: %f "
2454  "(key_distinct: %f, norm_abbrev_card: %f, prop_card: %f)",
2455  memtupcount, abbrev_distinct, key_distinct, norm_abbrev_card,
2456  sss->prop_card);
2457  }
2458 
2459  /*
2460  * If the number of distinct abbreviated keys approximately matches the
2461  * number of distinct authoritative original keys, that's reason enough to
2462  * proceed. We can win even with a very low cardinality set if most
2463  * tie-breakers only memcmp(). This is by far the most important
2464  * consideration.
2465  *
2466  * While comparisons that are resolved at the abbreviated key level are
2467  * considerably cheaper than tie-breakers resolved with memcmp(), both of
2468  * those two outcomes are so much cheaper than a full strcoll() once
2469  * sorting is underway that it doesn't seem worth it to weigh abbreviated
2470  * cardinality against the overall size of the set in order to more
2471  * accurately model costs. Assume that an abbreviated comparison, and an
2472  * abbreviated comparison with a cheap memcmp()-based authoritative
2473  * resolution are equivalent.
2474  */
2475  if (abbrev_distinct > key_distinct * sss->prop_card)
2476  {
2477  /*
2478  * When we have exceeded 10,000 tuples, decay required cardinality
2479  * aggressively for next call.
2480  *
2481  * This is useful because the number of comparisons required on
2482  * average increases at a linearithmic rate, and at roughly 10,000
2483  * tuples that factor will start to dominate over the linear costs of
2484  * string transformation (this is a conservative estimate). The decay
2485  * rate is chosen to be a little less aggressive than halving -- which
2486  * (since we're called at points at which memtupcount has doubled)
2487  * would never see the cost model actually abort past the first call
2488  * following a decay. This decay rate is mostly a precaution against
2489  * a sudden, violent swing in how well abbreviated cardinality tracks
2490  * full key cardinality. The decay also serves to prevent a marginal
2491  * case from being aborted too late, when too much has already been
2492  * invested in string transformation.
2493  *
2494  * It's possible for sets of several million distinct strings with
2495  * mere tens of thousands of distinct abbreviated keys to still
2496  * benefit very significantly. This will generally occur provided
2497  * each abbreviated key is a proxy for a roughly uniform number of the
2498  * set's full keys. If it isn't so, we hope to catch that early and
2499  * abort. If it isn't caught early, by the time the problem is
2500  * apparent it's probably not worth aborting.
2501  */
2502  if (memtupcount > 10000)
2503  sss->prop_card *= 0.65;
2504 
2505  return false;
2506  }
2507 
2508  /*
2509  * Abort abbreviation strategy.
2510  *
2511  * The worst case, where all abbreviated keys are identical while all
2512  * original strings differ will typically only see a regression of about
2513  * 10% in execution time for small to medium sized lists of strings.
2514  * Whereas on modern CPUs where cache stalls are the dominant cost, we can
2515  * often expect very large improvements, particularly with sets of strings
2516  * of moderately high to high abbreviated cardinality. There is little to
2517  * lose but much to gain, which our strategy reflects.
2518  */
2519  if (trace_sort)
2520  elog(LOG, "varstr_abbrev: aborted abbreviation at %d "
2521  "(abbrev_distinct: %f, key_distinct: %f, prop_card: %f)",
2522  memtupcount, abbrev_distinct, key_distinct, sss->prop_card);
2523 
2524  return true;
2525 }
2526 
2527 /*
2528  * Generic equalimage support function for character type's operator classes.
2529  * Disables the use of deduplication with nondeterministic collations.
2530  */
2531 Datum
2533 {
2534  /* Oid opcintype = PG_GETARG_OID(0); */
2537 
2539 
2541 
2542  PG_RETURN_BOOL(locale->deterministic);
2543 }
2544 
2545 Datum
2547 {
2548  text *arg1 = PG_GETARG_TEXT_PP(0);
2549  text *arg2 = PG_GETARG_TEXT_PP(1);
2550  text *result;
2551 
2552  result = ((text_cmp(arg1, arg2, PG_GET_COLLATION()) > 0) ? arg1 : arg2);
2553 
2554  PG_RETURN_TEXT_P(result);
2555 }
2556 
2557 Datum
2559 {
2560  text *arg1 = PG_GETARG_TEXT_PP(0);
2561  text *arg2 = PG_GETARG_TEXT_PP(1);
2562  text *result;
2563 
2564  result = ((text_cmp(arg1, arg2, PG_GET_COLLATION()) < 0) ? arg1 : arg2);
2565 
2566  PG_RETURN_TEXT_P(result);
2567 }
2568 
2569 
2570 /*
2571  * Cross-type comparison functions for types text and name.
2572  */
2573 
2574 Datum
2576 {
2577  Name arg1 = PG_GETARG_NAME(0);
2578  text *arg2 = PG_GETARG_TEXT_PP(1);
2579  size_t len1 = strlen(NameStr(*arg1));
2580  size_t len2 = VARSIZE_ANY_EXHDR(arg2);
2582  bool result;
2583 
2585 
2586  if (collid == C_COLLATION_OID)
2587  result = (len1 == len2 &&
2588  memcmp(NameStr(*arg1), VARDATA_ANY(arg2), len1) == 0);
2589  else
2590  result = (varstr_cmp(NameStr(*arg1), len1,
2591  VARDATA_ANY(arg2), len2,
2592  collid) == 0);
2593 
2594  PG_FREE_IF_COPY(arg2, 1);
2595 
2596  PG_RETURN_BOOL(result);
2597 }
2598 
2599 Datum
2601 {
2602  text *arg1 = PG_GETARG_TEXT_PP(0);
2603  Name arg2 = PG_GETARG_NAME(1);
2604  size_t len1 = VARSIZE_ANY_EXHDR(arg1);
2605  size_t len2 = strlen(NameStr(*arg2));
2607  bool result;
2608 
2610 
2611  if (collid == C_COLLATION_OID)
2612  result = (len1 == len2 &&
2613  memcmp(VARDATA_ANY(arg1), NameStr(*arg2), len1) == 0);
2614  else
2615  result = (varstr_cmp(VARDATA_ANY(arg1), len1,
2616  NameStr(*arg2), len2,
2617  collid) == 0);
2618 
2619  PG_FREE_IF_COPY(arg1, 0);
2620 
2621  PG_RETURN_BOOL(result);
2622 }
2623 
2624 Datum
2626 {
2627  Name arg1 = PG_GETARG_NAME(0);
2628  text *arg2 = PG_GETARG_TEXT_PP(1);
2629  size_t len1 = strlen(NameStr(*arg1));
2630  size_t len2 = VARSIZE_ANY_EXHDR(arg2);
2632  bool result;
2633 
2635 
2636  if (collid == C_COLLATION_OID)
2637  result = !(len1 == len2 &&
2638  memcmp(NameStr(*arg1), VARDATA_ANY(arg2), len1) == 0);
2639  else
2640  result = !(varstr_cmp(NameStr(*arg1), len1,
2641  VARDATA_ANY(arg2), len2,
2642  collid) == 0);
2643 
2644  PG_FREE_IF_COPY(arg2, 1);
2645 
2646  PG_RETURN_BOOL(result);
2647 }
2648 
2649 Datum
2651 {
2652  text *arg1 = PG_GETARG_TEXT_PP(0);
2653  Name arg2 = PG_GETARG_NAME(1);
2654  size_t len1 = VARSIZE_ANY_EXHDR(arg1);
2655  size_t len2 = strlen(NameStr(*arg2));
2657  bool result;
2658 
2660 
2661  if (collid == C_COLLATION_OID)
2662  result = !(len1 == len2 &&
2663  memcmp(VARDATA_ANY(arg1), NameStr(*arg2), len1) == 0);
2664  else
2665  result = !(varstr_cmp(VARDATA_ANY(arg1), len1,
2666  NameStr(*arg2), len2,
2667  collid) == 0);
2668 
2669  PG_FREE_IF_COPY(arg1, 0);
2670 
2671  PG_RETURN_BOOL(result);
2672 }
2673 
2674 Datum
2676 {
2677  Name arg1 = PG_GETARG_NAME(0);
2678  text *arg2 = PG_GETARG_TEXT_PP(1);
2679  int32 result;
2680 
2681  result = varstr_cmp(NameStr(*arg1), strlen(NameStr(*arg1)),
2682  VARDATA_ANY(arg2), VARSIZE_ANY_EXHDR(arg2),
2683  PG_GET_COLLATION());
2684 
2685  PG_FREE_IF_COPY(arg2, 1);
2686 
2687  PG_RETURN_INT32(result);
2688 }
2689 
2690 Datum
2692 {
2693  text *arg1 = PG_GETARG_TEXT_PP(0);
2694  Name arg2 = PG_GETARG_NAME(1);
2695  int32 result;
2696 
2697  result = varstr_cmp(VARDATA_ANY(arg1), VARSIZE_ANY_EXHDR(arg1),
2698  NameStr(*arg2), strlen(NameStr(*arg2)),
2699  PG_GET_COLLATION());
2700 
2701  PG_FREE_IF_COPY(arg1, 0);
2702 
2703  PG_RETURN_INT32(result);
2704 }
2705 
2706 #define CmpCall(cmpfunc) \
2707  DatumGetInt32(DirectFunctionCall2Coll(cmpfunc, \
2708  PG_GET_COLLATION(), \
2709  PG_GETARG_DATUM(0), \
2710  PG_GETARG_DATUM(1)))
2711 
2712 Datum
2714 {
2716 }
2717 
2718 Datum
2720 {
2722 }
2723 
2724 Datum
2726 {
2728 }
2729 
2730 Datum
2732 {
2734 }
2735 
2736 Datum
2738 {
2740 }
2741 
2742 Datum
2744 {
2746 }
2747 
2748 Datum
2750 {
2752 }
2753 
2754 Datum
2756 {
2758 }
2759 
2760 #undef CmpCall
2761 
2762 
2763 /*
2764  * The following operators support character-by-character comparison
2765  * of text datums, to allow building indexes suitable for LIKE clauses.
2766  * Note that the regular texteq/textne comparison operators, and regular
2767  * support functions 1 and 2 with "C" collation are assumed to be
2768  * compatible with these!
2769  */
2770 
2771 static int
2773 {
2774  int result;
2775  int len1,
2776  len2;
2777 
2778  len1 = VARSIZE_ANY_EXHDR(arg1);
2779  len2 = VARSIZE_ANY_EXHDR(arg2);
2780 
2781  result = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
2782  if (result != 0)
2783  return result;
2784  else if (len1 < len2)
2785  return -1;
2786  else if (len1 > len2)
2787  return 1;
2788  else
2789  return 0;
2790 }
2791 
2792 
2793 Datum
2795 {
2796  text *arg1 = PG_GETARG_TEXT_PP(0);
2797  text *arg2 = PG_GETARG_TEXT_PP(1);
2798  int result;
2799 
2800  result = internal_text_pattern_compare(arg1, arg2);
2801 
2802  PG_FREE_IF_COPY(arg1, 0);
2803  PG_FREE_IF_COPY(arg2, 1);
2804 
2805  PG_RETURN_BOOL(result < 0);
2806 }
2807 
2808 
2809 Datum
2811 {
2812  text *arg1 = PG_GETARG_TEXT_PP(0);
2813  text *arg2 = PG_GETARG_TEXT_PP(1);
2814  int result;
2815 
2816  result = internal_text_pattern_compare(arg1, arg2);
2817 
2818  PG_FREE_IF_COPY(arg1, 0);
2819  PG_FREE_IF_COPY(arg2, 1);
2820 
2821  PG_RETURN_BOOL(result <= 0);
2822 }
2823 
2824 
2825 Datum
2827 {
2828  text *arg1 = PG_GETARG_TEXT_PP(0);
2829  text *arg2 = PG_GETARG_TEXT_PP(1);
2830  int result;
2831 
2832  result = internal_text_pattern_compare(arg1, arg2);
2833 
2834  PG_FREE_IF_COPY(arg1, 0);
2835  PG_FREE_IF_COPY(arg2, 1);
2836 
2837  PG_RETURN_BOOL(result >= 0);
2838 }
2839 
2840 
2841 Datum
2843 {
2844  text *arg1 = PG_GETARG_TEXT_PP(0);
2845  text *arg2 = PG_GETARG_TEXT_PP(1);
2846  int result;
2847 
2848  result = internal_text_pattern_compare(arg1, arg2);
2849 
2850  PG_FREE_IF_COPY(arg1, 0);
2851  PG_FREE_IF_COPY(arg2, 1);
2852 
2853  PG_RETURN_BOOL(result > 0);
2854 }
2855 
2856 
2857 Datum
2859 {
2860  text *arg1 = PG_GETARG_TEXT_PP(0);
2861  text *arg2 = PG_GETARG_TEXT_PP(1);
2862  int result;
2863 
2864  result = internal_text_pattern_compare(arg1, arg2);
2865 
2866  PG_FREE_IF_COPY(arg1, 0);
2867  PG_FREE_IF_COPY(arg2, 1);
2868 
2869  PG_RETURN_INT32(result);
2870 }
2871 
2872 
2873 Datum
2875 {
2877  MemoryContext oldcontext;
2878 
2879  oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
2880 
2881  /* Use generic string SortSupport, forcing "C" collation */
2882  varstr_sortsupport(ssup, TEXTOID, C_COLLATION_OID);
2883 
2884  MemoryContextSwitchTo(oldcontext);
2885 
2886  PG_RETURN_VOID();
2887 }
2888 
2889 
2890 /*-------------------------------------------------------------
2891  * byteaoctetlen
2892  *
2893  * get the number of bytes contained in an instance of type 'bytea'
2894  *-------------------------------------------------------------
2895  */
2896 Datum
2898 {
2899  Datum str = PG_GETARG_DATUM(0);
2900 
2901  /* We need not detoast the input at all */
2903 }
2904 
2905 /*
2906  * byteacat -
2907  * takes two bytea* and returns a bytea* that is the concatenation of
2908  * the two.
2909  *
2910  * Cloned from textcat and modified as required.
2911  */
2912 Datum
2914 {
2915  bytea *t1 = PG_GETARG_BYTEA_PP(0);
2916  bytea *t2 = PG_GETARG_BYTEA_PP(1);
2917 
2919 }
2920 
2921 /*
2922  * bytea_catenate
2923  * Guts of byteacat(), broken out so it can be used by other functions
2924  *
2925  * Arguments can be in short-header form, but not compressed or out-of-line
2926  */
2927 static bytea *
2929 {
2930  bytea *result;
2931  int len1,
2932  len2,
2933  len;
2934  char *ptr;
2935 
2936  len1 = VARSIZE_ANY_EXHDR(t1);
2937  len2 = VARSIZE_ANY_EXHDR(t2);
2938 
2939  /* paranoia ... probably should throw error instead? */
2940  if (len1 < 0)
2941  len1 = 0;
2942  if (len2 < 0)
2943  len2 = 0;
2944 
2945  len = len1 + len2 + VARHDRSZ;
2946  result = (bytea *) palloc(len);
2947 
2948  /* Set size of result string... */
2949  SET_VARSIZE(result, len);
2950 
2951  /* Fill data field of result string... */
2952  ptr = VARDATA(result);
2953  if (len1 > 0)
2954  memcpy(ptr, VARDATA_ANY(t1), len1);
2955  if (len2 > 0)
2956  memcpy(ptr + len1, VARDATA_ANY(t2), len2);
2957 
2958  return result;
2959 }
2960 
2961 #define PG_STR_GET_BYTEA(str_) \
2962  DatumGetByteaPP(DirectFunctionCall1(byteain, CStringGetDatum(str_)))
2963 
2964 /*
2965  * bytea_substr()
2966  * Return a substring starting at the specified position.
2967  * Cloned from text_substr and modified as required.
2968  *
2969  * Input:
2970  * - string
2971  * - starting position (is one-based)
2972  * - string length (optional)
2973  *
2974  * If the starting position is zero or less, then return from the start of the string
2975  * adjusting the length to be consistent with the "negative start" per SQL.
2976  * If the length is less than zero, an ERROR is thrown. If no third argument
2977  * (length) is provided, the length to the end of the string is assumed.
2978  */
2979 Datum
2981 {
2983  PG_GETARG_INT32(1),
2984  PG_GETARG_INT32(2),
2985  false));
2986 }
2987 
2988 /*
2989  * bytea_substr_no_len -
2990  * Wrapper to avoid opr_sanity failure due to
2991  * one function accepting a different number of args.
2992  */
2993 Datum
2995 {
2997  PG_GETARG_INT32(1),
2998  -1,
2999  true));
3000 }
3001 
3002 static bytea *
3004  int S,
3005  int L,
3006  bool length_not_specified)
3007 {
3008  int32 S1; /* adjusted start position */
3009  int32 L1; /* adjusted substring length */
3010  int32 E; /* end position */
3011 
3012  /*
3013  * The logic here should generally match text_substring().
3014  */
3015  S1 = Max(S, 1);
3016 
3017  if (length_not_specified)
3018  {
3019  /*
3020  * Not passed a length - DatumGetByteaPSlice() grabs everything to the
3021  * end of the string if we pass it a negative value for length.
3022  */
3023  L1 = -1;
3024  }
3025  else if (L < 0)
3026  {
3027  /* SQL99 says to throw an error for E < S, i.e., negative length */
3028  ereport(ERROR,
3029  (errcode(ERRCODE_SUBSTRING_ERROR),
3030  errmsg("negative substring length not allowed")));
3031  L1 = -1; /* silence stupider compilers */
3032  }
3033  else if (pg_add_s32_overflow(S, L, &E))
3034  {
3035  /*
3036  * L could be large enough for S + L to overflow, in which case the
3037  * substring must run to end of string.
3038  */
3039  L1 = -1;
3040  }
3041  else
3042  {
3043  /*
3044  * A zero or negative value for the end position can happen if the
3045  * start was negative or one. SQL99 says to return a zero-length
3046  * string.
3047  */
3048  if (E < 1)
3049  return PG_STR_GET_BYTEA("");
3050 
3051  L1 = E - S1;
3052  }
3053 
3054  /*
3055  * If the start position is past the end of the string, SQL99 says to
3056  * return a zero-length string -- DatumGetByteaPSlice() will do that for
3057  * us. We need only convert S1 to zero-based starting position.
3058  */
3059  return DatumGetByteaPSlice(str, S1 - 1, L1);
3060 }
3061 
3062 /*
3063  * byteaoverlay
3064  * Replace specified substring of first string with second
3065  *
3066  * The SQL standard defines OVERLAY() in terms of substring and concatenation.
3067  * This code is a direct implementation of what the standard says.
3068  */
3069 Datum
3071 {
3072  bytea *t1 = PG_GETARG_BYTEA_PP(0);
3073  bytea *t2 = PG_GETARG_BYTEA_PP(1);
3074  int sp = PG_GETARG_INT32(2); /* substring start position */
3075  int sl = PG_GETARG_INT32(3); /* substring length */
3076 
3077  PG_RETURN_BYTEA_P(bytea_overlay(t1, t2, sp, sl));
3078 }
3079 
3080 Datum
3082 {
3083  bytea *t1 = PG_GETARG_BYTEA_PP(0);
3084  bytea *t2 = PG_GETARG_BYTEA_PP(1);
3085  int sp = PG_GETARG_INT32(2); /* substring start position */
3086  int sl;
3087 
3088  sl = VARSIZE_ANY_EXHDR(t2); /* defaults to length(t2) */
3089  PG_RETURN_BYTEA_P(bytea_overlay(t1, t2, sp, sl));
3090 }
3091 
3092 static bytea *
3093 bytea_overlay(bytea *t1, bytea *t2, int sp, int sl)
3094 {
3095  bytea *result;
3096  bytea *s1;
3097  bytea *s2;
3098  int sp_pl_sl;
3099 
3100  /*
3101  * Check for possible integer-overflow cases. For negative sp, throw a
3102  * "substring length" error because that's what should be expected
3103  * according to the spec's definition of OVERLAY().
3104  */
3105  if (sp <= 0)
3106  ereport(ERROR,
3107  (errcode(ERRCODE_SUBSTRING_ERROR),
3108  errmsg("negative substring length not allowed")));
3109  if (pg_add_s32_overflow(sp, sl, &sp_pl_sl))
3110  ereport(ERROR,
3111  (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
3112  errmsg("integer out of range")));
3113 
3114  s1 = bytea_substring(PointerGetDatum(t1), 1, sp - 1, false);
3115  s2 = bytea_substring(PointerGetDatum(t1), sp_pl_sl, -1, true);
3116  result = bytea_catenate(s1, t2);
3117  result = bytea_catenate(result, s2);
3118 
3119  return result;
3120 }
3121 
3122 /*
3123  * bit_count
3124  */
3125 Datum
3127 {
3128  bytea *t1 = PG_GETARG_BYTEA_PP(0);
3129 
3131 }
3132 
3133 /*
3134  * byteapos -
3135  * Return the position of the specified substring.
3136  * Implements the SQL POSITION() function.
3137  * Cloned from textpos and modified as required.
3138  */
3139 Datum
3141 {
3142  bytea *t1 = PG_GETARG_BYTEA_PP(0);
3143  bytea *t2 = PG_GETARG_BYTEA_PP(1);
3144  int pos;
3145  int px,
3146  p;
3147  int len1,
3148  len2;
3149  char *p1,
3150  *p2;
3151 
3152  len1 = VARSIZE_ANY_EXHDR(t1);
3153  len2 = VARSIZE_ANY_EXHDR(t2);
3154 
3155  if (len2 <= 0)
3156  PG_RETURN_INT32(1); /* result for empty pattern */
3157 
3158  p1 = VARDATA_ANY(t1);
3159  p2 = VARDATA_ANY(t2);
3160 
3161  pos = 0;
3162  px = (len1 - len2);
3163  for (p = 0; p <= px; p++)
3164  {
3165  if ((*p2 == *p1) && (memcmp(p1, p2, len2) == 0))
3166  {
3167  pos = p + 1;
3168  break;
3169  };
3170  p1++;
3171  };
3172 
3173  PG_RETURN_INT32(pos);
3174 }
3175 
3176 /*-------------------------------------------------------------
3177  * byteaGetByte
3178  *
3179  * this routine treats "bytea" as an array of bytes.
3180  * It returns the Nth byte (a number between 0 and 255).
3181  *-------------------------------------------------------------
3182  */
3183 Datum
3185 {
3186  bytea *v = PG_GETARG_BYTEA_PP(0);
3187  int32 n = PG_GETARG_INT32(1);
3188  int len;
3189  int byte;
3190 
3191  len = VARSIZE_ANY_EXHDR(v);
3192 
3193  if (n < 0 || n >= len)
3194  ereport(ERROR,
3195  (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
3196  errmsg("index %d out of valid range, 0..%d",
3197  n, len - 1)));
3198 
3199  byte = ((unsigned char *) VARDATA_ANY(v))[n];
3200 
3201  PG_RETURN_INT32(byte);
3202 }
3203 
3204 /*-------------------------------------------------------------
3205  * byteaGetBit
3206  *
3207  * This routine treats a "bytea" type like an array of bits.
3208  * It returns the value of the Nth bit (0 or 1).
3209  *
3210  *-------------------------------------------------------------
3211  */
3212 Datum
3214 {
3215  bytea *v = PG_GETARG_BYTEA_PP(0);
3216  int64 n = PG_GETARG_INT64(1);
3217  int byteNo,
3218  bitNo;
3219  int len;
3220  int byte;
3221 
3222  len = VARSIZE_ANY_EXHDR(v);
3223 
3224  if (n < 0 || n >= (int64) len * 8)
3225  ereport(ERROR,
3226  (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
3227  errmsg("index %lld out of valid range, 0..%lld",
3228  (long long) n, (long long) len * 8 - 1)));
3229 
3230  /* n/8 is now known < len, so safe to cast to int */
3231  byteNo = (int) (n / 8);
3232  bitNo = (int) (n % 8);
3233 
3234  byte = ((unsigned char *) VARDATA_ANY(v))[byteNo];
3235 
3236  if (byte & (1 << bitNo))
3237  PG_RETURN_INT32(1);
3238  else
3239  PG_RETURN_INT32(0);
3240 }
3241 
3242 /*-------------------------------------------------------------
3243  * byteaSetByte
3244  *
3245  * Given an instance of type 'bytea' creates a new one with
3246  * the Nth byte set to the given value.
3247  *
3248  *-------------------------------------------------------------
3249  */
3250 Datum
3252 {
3254  int32 n = PG_GETARG_INT32(1);
3255  int32 newByte = PG_GETARG_INT32(2);
3256  int len;
3257 
3258  len = VARSIZE(res) - VARHDRSZ;
3259 
3260  if (n < 0 || n >= len)
3261  ereport(ERROR,
3262  (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
3263  errmsg("index %d out of valid range, 0..%d",
3264  n, len - 1)));
3265 
3266  /*
3267  * Now set the byte.
3268  */
3269  ((unsigned char *) VARDATA(res))[n] = newByte;
3270 
3272 }
3273 
3274 /*-------------------------------------------------------------
3275  * byteaSetBit
3276  *
3277  * Given an instance of type 'bytea' creates a new one with
3278  * the Nth bit set to the given value.
3279  *
3280  *-------------------------------------------------------------
3281  */
3282 Datum
3284 {
3286  int64 n = PG_GETARG_INT64(1);
3287  int32 newBit = PG_GETARG_INT32(2);
3288  int len;
3289  int oldByte,
3290  newByte;
3291  int byteNo,
3292  bitNo;
3293 
3294  len = VARSIZE(res) - VARHDRSZ;
3295 
3296  if (n < 0 || n >= (int64) len * 8)
3297  ereport(ERROR,
3298  (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
3299  errmsg("index %lld out of valid range, 0..%lld",
3300  (long long) n, (long long) len * 8 - 1)));
3301 
3302  /* n/8 is now known < len, so safe to cast to int */
3303  byteNo = (int) (n / 8);
3304  bitNo = (int) (n % 8);
3305 
3306  /*
3307  * sanity check!
3308  */
3309  if (newBit != 0 && newBit != 1)
3310  ereport(ERROR,
3311  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3312  errmsg("new bit must be 0 or 1")));
3313 
3314  /*
3315  * Update the byte.
3316  */
3317  oldByte = ((unsigned char *) VARDATA(res))[byteNo];
3318 
3319  if (newBit == 0)
3320  newByte = oldByte & (~(1 << bitNo));
3321  else
3322  newByte = oldByte | (1 << bitNo);
3323 
3324  ((unsigned char *) VARDATA(res))[byteNo] = newByte;
3325 
3327 }
3328 
3329 
3330 /* text_name()
3331  * Converts a text type to a Name type.
3332  */
3333 Datum
3335 {
3336  text *s = PG_GETARG_TEXT_PP(0);
3337  Name result;
3338  int len;
3339 
3340  len = VARSIZE_ANY_EXHDR(s);
3341 
3342  /* Truncate oversize input */
3343  if (len >= NAMEDATALEN)
3345 
3346  /* We use palloc0 here to ensure result is zero-padded */
3347  result = (Name) palloc0(NAMEDATALEN);
3348  memcpy(NameStr(*result), VARDATA_ANY(s), len);
3349 
3350  PG_RETURN_NAME(result);
3351 }
3352 
3353 /* name_text()
3354  * Converts a Name type to a text type.
3355  */
3356 Datum
3358 {
3359  Name s = PG_GETARG_NAME(0);
3360 
3362 }
3363 
3364 
3365 /*
3366  * textToQualifiedNameList - convert a text object to list of names
3367  *
3368  * This implements the input parsing needed by nextval() and other
3369  * functions that take a text parameter representing a qualified name.
3370  * We split the name at dots, downcase if not double-quoted, and
3371  * truncate names if they're too long.
3372  */
3373 List *
3375 {
3376  char *rawname;
3377  List *result = NIL;
3378  List *namelist;
3379  ListCell *l;
3380 
3381  /* Convert to C string (handles possible detoasting). */
3382  /* Note we rely on being able to modify rawname below. */
3383  rawname = text_to_cstring(textval);
3384 
3385  if (!SplitIdentifierString(rawname, '.', &namelist))
3386  ereport(ERROR,
3387  (errcode(ERRCODE_INVALID_NAME),
3388  errmsg("invalid name syntax")));
3389 
3390  if (namelist == NIL)
3391  ereport(ERROR,
3392  (errcode(ERRCODE_INVALID_NAME),
3393  errmsg("invalid name syntax")));
3394 
3395  foreach(l, namelist)
3396  {
3397  char *curname = (char *) lfirst(l);
3398 
3399  result = lappend(result, makeString(pstrdup(curname)));
3400  }
3401 
3402  pfree(rawname);
3403  list_free(namelist);
3404 
3405  return result;
3406 }
3407 
3408 /*
3409  * SplitIdentifierString --- parse a string containing identifiers
3410  *
3411  * This is the guts of textToQualifiedNameList, and is exported for use in
3412  * other situations such as parsing GUC variables. In the GUC case, it's
3413  * important to avoid memory leaks, so the API is designed to minimize the
3414  * amount of stuff that needs to be allocated and freed.
3415  *
3416  * Inputs:
3417  * rawstring: the input string; must be overwritable! On return, it's
3418  * been modified to contain the separated identifiers.
3419  * separator: the separator punctuation expected between identifiers
3420  * (typically '.' or ','). Whitespace may also appear around
3421  * identifiers.
3422  * Outputs:
3423  * namelist: filled with a palloc'd list of pointers to identifiers within
3424  * rawstring. Caller should list_free() this even on error return.
3425  *
3426  * Returns true if okay, false if there is a syntax error in the string.
3427  *
3428  * Note that an empty string is considered okay here, though not in
3429  * textToQualifiedNameList.
3430  */
3431 bool
3432 SplitIdentifierString(char *rawstring, char separator,
3433  List **namelist)
3434 {
3435  char *nextp = rawstring;
3436  bool done = false;
3437 
3438  *namelist = NIL;
3439 
3440  while (scanner_isspace(*nextp))
3441  nextp++; /* skip leading whitespace */
3442 
3443  if (*nextp == '\0')
3444  return true; /* allow empty string */
3445 
3446  /* At the top of the loop, we are at start of a new identifier. */
3447  do
3448  {
3449  char *curname;
3450  char *endp;
3451 
3452  if (*nextp == '"')
3453  {
3454  /* Quoted name --- collapse quote-quote pairs, no downcasing */
3455  curname = nextp + 1;
3456  for (;;)
3457  {
3458  endp = strchr(nextp + 1, '"');
3459  if (endp == NULL)
3460  return false; /* mismatched quotes */
3461  if (endp[1] != '"')
3462  break; /* found end of quoted name */
3463  /* Collapse adjacent quotes into one quote, and look again */
3464  memmove(endp, endp + 1, strlen(endp));
3465  nextp = endp;
3466  }
3467  /* endp now points at the terminating quote */
3468  nextp = endp + 1;
3469  }
3470  else
3471  {
3472  /* Unquoted name --- extends to separator or whitespace */
3473  char *downname;
3474  int len;
3475 
3476  curname = nextp;
3477  while (*nextp && *nextp != separator &&
3478  !scanner_isspace(*nextp))
3479  nextp++;
3480  endp = nextp;
3481  if (curname == nextp)
3482  return false; /* empty unquoted name not allowed */
3483 
3484  /*
3485  * Downcase the identifier, using same code as main lexer does.
3486  *
3487  * XXX because we want to overwrite the input in-place, we cannot
3488  * support a downcasing transformation that increases the string
3489  * length. This is not a problem given the current implementation
3490  * of downcase_truncate_identifier, but we'll probably have to do
3491  * something about this someday.
3492  */
3493  len = endp - curname;
3494  downname = downcase_truncate_identifier(curname, len, false);
3495  Assert(strlen(downname) <= len);
3496  strncpy(curname, downname, len); /* strncpy is required here */
3497  pfree(downname);
3498  }
3499 
3500  while (scanner_isspace(*nextp))
3501  nextp++; /* skip trailing whitespace */
3502 
3503  if (*nextp == separator)
3504  {
3505  nextp++;
3506  while (scanner_isspace(*nextp))
3507  nextp++; /* skip leading whitespace for next */
3508  /* we expect another name, so done remains false */
3509  }
3510  else if (*nextp == '\0')
3511  done = true;
3512  else
3513  return false; /* invalid syntax */
3514 
3515  /* Now safe to overwrite separator with a null */
3516  *endp = '\0';
3517 
3518  /* Truncate name if it's overlength */
3519  truncate_identifier(curname, strlen(curname), false);
3520 
3521  /*
3522  * Finished isolating current name --- add it to list
3523  */
3524  *namelist = lappend(*namelist, curname);
3525 
3526  /* Loop back if we didn't reach end of string */
3527  } while (!done);
3528 
3529  return true;
3530 }
3531 
3532 
3533 /*
3534  * SplitDirectoriesString --- parse a string containing file/directory names
3535  *
3536  * This works fine on file names too; the function name is historical.
3537  *
3538  * This is similar to SplitIdentifierString, except that the parsing
3539  * rules are meant to handle pathnames instead of identifiers: there is
3540  * no downcasing, embedded spaces are allowed, the max length is MAXPGPATH-1,
3541  * and we apply canonicalize_path() to each extracted string. Because of the
3542  * last, the returned strings are separately palloc'd rather than being
3543  * pointers into rawstring --- but we still scribble on rawstring.
3544  *
3545  * Inputs:
3546  * rawstring: the input string; must be modifiable!
3547  * separator: the separator punctuation expected between directories
3548  * (typically ',' or ';'). Whitespace may also appear around
3549  * directories.
3550  * Outputs:
3551  * namelist: filled with a palloc'd list of directory names.
3552  * Caller should list_free_deep() this even on error return.
3553  *
3554  * Returns true if okay, false if there is a syntax error in the string.
3555  *
3556  * Note that an empty string is considered okay here.
3557  */
3558 bool
3559 SplitDirectoriesString(char *rawstring, char separator,
3560  List **namelist)
3561 {
3562  char *nextp = rawstring;
3563  bool done = false;
3564 
3565  *namelist = NIL;
3566 
3567  while (scanner_isspace(*nextp))
3568  nextp++; /* skip leading whitespace */
3569 
3570  if (*nextp == '\0')
3571  return true; /* allow empty string */
3572 
3573  /* At the top of the loop, we are at start of a new directory. */
3574  do
3575  {
3576  char *curname;
3577  char *endp;
3578 
3579  if (*nextp == '"')
3580  {
3581  /* Quoted name --- collapse quote-quote pairs */
3582  curname = nextp + 1;
3583  for (;;)
3584  {
3585  endp = strchr(nextp + 1, '"');
3586  if (endp == NULL)
3587  return false; /* mismatched quotes */
3588  if (endp[1] != '"')
3589  break; /* found end of quoted name */
3590  /* Collapse adjacent quotes into one quote, and look again */
3591  memmove(endp, endp + 1, strlen(endp));
3592  nextp = endp;
3593  }
3594  /* endp now points at the terminating quote */
3595  nextp = endp + 1;
3596  }
3597  else
3598  {
3599  /* Unquoted name --- extends to separator or end of string */
3600  curname = endp = nextp;
3601  while (*nextp && *nextp != separator)
3602  {
3603  /* trailing whitespace should not be included in name */
3604  if (!scanner_isspace(*nextp))
3605  endp = nextp + 1;
3606  nextp++;
3607  }
3608  if (curname == endp)
3609  return false; /* empty unquoted name not allowed */
3610  }
3611 
3612  while (scanner_isspace(*nextp))
3613  nextp++; /* skip trailing whitespace */
3614 
3615  if (*nextp == separator)
3616  {
3617  nextp++;
3618  while (scanner_isspace(*nextp))
3619  nextp++; /* skip leading whitespace for next */
3620  /* we expect another name, so done remains false */
3621  }
3622  else if (*nextp == '\0')
3623  done = true;
3624  else
3625  return false; /* invalid syntax */
3626 
3627  /* Now safe to overwrite separator with a null */
3628  *endp = '\0';
3629 
3630  /* Truncate path if it's overlength */
3631  if (strlen(curname) >= MAXPGPATH)
3632  curname[MAXPGPATH - 1] = '\0';
3633 
3634  /*
3635  * Finished isolating current name --- add it to list
3636  */
3637  curname = pstrdup(curname);
3638  canonicalize_path(curname);
3639  *namelist = lappend(*namelist, curname);
3640 
3641  /* Loop back if we didn't reach end of string */
3642  } while (!done);
3643 
3644  return true;
3645 }
3646 
3647 
3648 /*
3649  * SplitGUCList --- parse a string containing identifiers or file names
3650  *
3651  * This is used to split the value of a GUC_LIST_QUOTE GUC variable, without
3652  * presuming whether the elements will be taken as identifiers or file names.
3653  * We assume the input has already been through flatten_set_variable_args(),
3654  * so that we need never downcase (if appropriate, that was done already).
3655  * Nor do we ever truncate, since we don't know the correct max length.
3656  * We disallow embedded whitespace for simplicity (it shouldn't matter,
3657  * because any embedded whitespace should have led to double-quoting).
3658  * Otherwise the API is identical to SplitIdentifierString.
3659  *
3660  * XXX it's annoying to have so many copies of this string-splitting logic.
3661  * However, it's not clear that having one function with a bunch of option
3662  * flags would be much better.
3663  *
3664  * XXX there is a version of this function in src/bin/pg_dump/dumputils.c.
3665  * Be sure to update that if you have to change this.
3666  *
3667  * Inputs:
3668  * rawstring: the input string; must be overwritable! On return, it's
3669  * been modified to contain the separated identifiers.
3670  * separator: the separator punctuation expected between identifiers
3671  * (typically '.' or ','). Whitespace may also appear around
3672  * identifiers.
3673  * Outputs:
3674  * namelist: filled with a palloc'd list of pointers to identifiers within
3675  * rawstring. Caller should list_free() this even on error return.
3676  *
3677  * Returns true if okay, false if there is a syntax error in the string.
3678  */
3679 bool
3680 SplitGUCList(char *rawstring, char separator,
3681  List **namelist)
3682 {
3683  char *nextp = rawstring;
3684  bool done = false;
3685 
3686  *namelist = NIL;
3687 
3688  while (scanner_isspace(*nextp))
3689  nextp++; /* skip leading whitespace */
3690 
3691  if (*nextp == '\0')
3692  return true; /* allow empty string */
3693 
3694  /* At the top of the loop, we are at start of a new identifier. */
3695  do
3696  {
3697  char *curname;
3698  char *endp;
3699 
3700  if (*nextp == '"')
3701  {
3702  /* Quoted name --- collapse quote-quote pairs */
3703  curname = nextp + 1;
3704  for (;;)
3705  {
3706  endp = strchr(nextp + 1, '"');
3707  if (endp == NULL)
3708  return false; /* mismatched quotes */
3709  if (endp[1] != '"')
3710  break; /* found end of quoted name */
3711  /* Collapse adjacent quotes into one quote, and look again */
3712  memmove(endp, endp + 1, strlen(endp));
3713  nextp = endp;
3714  }
3715  /* endp now points at the terminating quote */
3716  nextp = endp + 1;
3717  }
3718  else
3719  {
3720  /* Unquoted name --- extends to separator or whitespace */
3721  curname = nextp;
3722  while (*nextp && *nextp != separator &&
3723  !scanner_isspace(*nextp))
3724  nextp++;
3725  endp = nextp;
3726  if (curname == nextp)
3727  return false; /* empty unquoted name not allowed */
3728  }
3729 
3730  while (scanner_isspace(*nextp))
3731  nextp++; /* skip trailing whitespace */
3732 
3733  if (*nextp == separator)
3734  {
3735  nextp++;
3736  while (scanner_isspace(*nextp))
3737  nextp++; /* skip leading whitespace for next */
3738  /* we expect another name, so done remains false */
3739  }
3740  else if (*nextp == '\0')
3741  done = true;
3742  else
3743  return false; /* invalid syntax */
3744 
3745  /* Now safe to overwrite separator with a null */
3746  *endp = '\0';
3747 
3748  /*
3749  * Finished isolating current name --- add it to list
3750  */
3751  *namelist = lappend(*namelist, curname);
3752 
3753  /* Loop back if we didn't reach end of string */
3754  } while (!done);
3755 
3756  return true;
3757 }
3758 
3759 
3760 /*****************************************************************************
3761  * Comparison Functions used for bytea
3762  *
3763  * Note: btree indexes need these routines not to leak memory; therefore,
3764  * be careful to free working copies of toasted datums. Most places don't
3765  * need to be so careful.
3766  *****************************************************************************/
3767 
3768 Datum
3770 {
3771  Datum arg1 = PG_GETARG_DATUM(0);
3772  Datum arg2 = PG_GETARG_DATUM(1);
3773  bool result;
3774  Size len1,
3775  len2;
3776 
3777  /*
3778  * We can use a fast path for unequal lengths, which might save us from
3779  * having to detoast one or both values.
3780  */
3781  len1 = toast_raw_datum_size(arg1);
3782  len2 = toast_raw_datum_size(arg2);
3783  if (len1 != len2)
3784  result = false;
3785  else
3786  {
3787  bytea *barg1 = DatumGetByteaPP(arg1);
3788  bytea *barg2 = DatumGetByteaPP(arg2);
3789 
3790  result = (memcmp(VARDATA_ANY(barg1), VARDATA_ANY(barg2),
3791  len1 - VARHDRSZ) == 0);
3792 
3793  PG_FREE_IF_COPY(barg1, 0);
3794  PG_FREE_IF_COPY(barg2, 1);
3795  }
3796 
3797  PG_RETURN_BOOL(result);
3798 }
3799 
3800 Datum
3802 {
3803  Datum arg1 = PG_GETARG_DATUM(0);
3804  Datum arg2 = PG_GETARG_DATUM(1);
3805  bool result;
3806  Size len1,
3807  len2;
3808 
3809  /*
3810  * We can use a fast path for unequal lengths, which might save us from
3811  * having to detoast one or both values.
3812  */
3813  len1 = toast_raw_datum_size(arg1);
3814  len2 = toast_raw_datum_size(arg2);
3815  if (len1 != len2)
3816  result = true;
3817  else
3818  {
3819  bytea *barg1 = DatumGetByteaPP(arg1);
3820  bytea *barg2 = DatumGetByteaPP(arg2);
3821 
3822  result = (memcmp(VARDATA_ANY(barg1), VARDATA_ANY(barg2),
3823  len1 - VARHDRSZ) != 0);
3824 
3825  PG_FREE_IF_COPY(barg1, 0);
3826  PG_FREE_IF_COPY(barg2, 1);
3827  }
3828 
3829  PG_RETURN_BOOL(result);
3830 }
3831 
3832 Datum
3834 {
3835  bytea *arg1 = PG_GETARG_BYTEA_PP(0);
3836  bytea *arg2 = PG_GETARG_BYTEA_PP(1);
3837  int len1,
3838  len2;
3839  int cmp;
3840 
3841  len1 = VARSIZE_ANY_EXHDR(arg1);
3842  len2 = VARSIZE_ANY_EXHDR(arg2);
3843 
3844  cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
3845 
3846  PG_FREE_IF_COPY(arg1, 0);
3847  PG_FREE_IF_COPY(arg2, 1);
3848 
3849  PG_RETURN_BOOL((cmp < 0) || ((cmp == 0) && (len1 < len2)));
3850 }
3851 
3852 Datum
3854 {
3855  bytea *arg1 = PG_GETARG_BYTEA_PP(0);
3856  bytea *arg2 = PG_GETARG_BYTEA_PP(1);
3857  int len1,
3858  len2;
3859  int cmp;
3860 
3861  len1 = VARSIZE_ANY_EXHDR(arg1);
3862  len2 = VARSIZE_ANY_EXHDR(arg2);
3863 
3864  cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
3865 
3866  PG_FREE_IF_COPY(arg1, 0);
3867  PG_FREE_IF_COPY(arg2, 1);
3868 
3869  PG_RETURN_BOOL((cmp < 0) || ((cmp == 0) && (len1 <= len2)));
3870 }
3871 
3872 Datum
3874 {
3875  bytea *arg1 = PG_GETARG_BYTEA_PP(0);
3876  bytea *arg2 = PG_GETARG_BYTEA_PP(1);
3877  int len1,
3878  len2;
3879  int cmp;
3880 
3881  len1 = VARSIZE_ANY_EXHDR(arg1);
3882  len2 = VARSIZE_ANY_EXHDR(arg2);
3883 
3884  cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
3885 
3886  PG_FREE_IF_COPY(arg1, 0);
3887  PG_FREE_IF_COPY(arg2, 1);
3888 
3889  PG_RETURN_BOOL((cmp > 0) || ((cmp == 0) && (len1 > len2)));
3890 }
3891 
3892 Datum
3894 {
3895  bytea *arg1 = PG_GETARG_BYTEA_PP(0);
3896  bytea *arg2 = PG_GETARG_BYTEA_PP(1);
3897  int len1,
3898  len2;
3899  int cmp;
3900 
3901  len1 = VARSIZE_ANY_EXHDR(arg1);
3902  len2 = VARSIZE_ANY_EXHDR(arg2);
3903 
3904  cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
3905 
3906  PG_FREE_IF_COPY(arg1, 0);
3907  PG_FREE_IF_COPY(arg2, 1);
3908 
3909  PG_RETURN_BOOL((cmp > 0) || ((cmp == 0) && (len1 >= len2)));
3910 }
3911 
3912 Datum
3914 {
3915  bytea *arg1 = PG_GETARG_BYTEA_PP(0);
3916  bytea *arg2 = PG_GETARG_BYTEA_PP(1);
3917  int len1,
3918  len2;
3919  int cmp;
3920 
3921  len1 = VARSIZE_ANY_EXHDR(arg1);
3922  len2 = VARSIZE_ANY_EXHDR(arg2);
3923 
3924  cmp = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
3925  if ((cmp == 0) && (len1 != len2))
3926  cmp = (len1 < len2) ? -1 : 1;
3927 
3928  PG_FREE_IF_COPY(arg1, 0);
3929  PG_FREE_IF_COPY(arg2, 1);
3930 
3932 }
3933 
3934 Datum
3936 {
3938  MemoryContext oldcontext;
3939 
3940  oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
3941 
3942  /* Use generic string SortSupport, forcing "C" collation */
3943  varstr_sortsupport(ssup, BYTEAOID, C_COLLATION_OID);
3944 
3945  MemoryContextSwitchTo(oldcontext);
3946 
3947  PG_RETURN_VOID();
3948 }
3949 
3950 /*
3951  * appendStringInfoText
3952  *
3953  * Append a text to str.
3954  * Like appendStringInfoString(str, text_to_cstring(t)) but faster.
3955  */
3956 static void
3958 {
3960 }
3961 
3962 /*
3963  * replace_text
3964  * replace all occurrences of 'old_sub_str' in 'orig_str'
3965  * with 'new_sub_str' to form 'new_str'
3966  *
3967  * returns 'orig_str' if 'old_sub_str' == '' or 'orig_str' == ''
3968  * otherwise returns 'new_str'
3969  */
3970 Datum
3972 {
3973  text *src_text = PG_GETARG_TEXT_PP(0);
3974  text *from_sub_text = PG_GETARG_TEXT_PP(1);
3975  text *to_sub_text = PG_GETARG_TEXT_PP(2);
3976  int src_text_len;
3977  int from_sub_text_len;
3979  text *ret_text;
3980  int chunk_len;
3981  char *curr_ptr;
3982  char *start_ptr;
3984  bool found;
3985 
3986  src_text_len = VARSIZE_ANY_EXHDR(src_text);
3987  from_sub_text_len = VARSIZE_ANY_EXHDR(from_sub_text);
3988 
3989  /* Return unmodified source string if empty source or pattern */
3990  if (src_text_len < 1 || from_sub_text_len < 1)
3991  {
3992  PG_RETURN_TEXT_P(src_text);
3993  }
3994 
3995  text_position_setup(src_text, from_sub_text, PG_GET_COLLATION(), &state);
3996 
3997  found = text_position_next(&state);
3998 
3999  /* When the from_sub_text is not found, there is nothing to do. */
4000  if (!found)
4001  {
4003  PG_RETURN_TEXT_P(src_text);
4004  }
4005  curr_ptr = text_position_get_match_ptr(&state);
4006  start_ptr = VARDATA_ANY(src_text);
4007 
4008  initStringInfo(&str);
4009 
4010  do
4011  {
4013 
4014  /* copy the data skipped over by last text_position_next() */
4015  chunk_len = curr_ptr - start_ptr;
4016  appendBinaryStringInfo(&str, start_ptr, chunk_len);
4017 
4018  appendStringInfoText(&str, to_sub_text);
4019 
4020  start_ptr = curr_ptr + from_sub_text_len;
4021 
4022  found = text_position_next(&state);
4023  if (found)
4024  curr_ptr = text_position_get_match_ptr(&state);
4025  }
4026  while (found);
4027 
4028  /* copy trailing data */
4029  chunk_len = ((char *) src_text + VARSIZE_ANY(src_text)) - start_ptr;
4030  appendBinaryStringInfo(&str, start_ptr, chunk_len);
4031 
4033 
4034  ret_text = cstring_to_text_with_len(str.data, str.len);
4035  pfree(str.data);
4036 
4037  PG_RETURN_TEXT_P(ret_text);
4038 }
4039 
4040 /*
4041  * check_replace_text_has_escape
4042  *
4043  * Returns 0 if text contains no backslashes that need processing.
4044  * Returns 1 if text contains backslashes, but not regexp submatch specifiers.
4045  * Returns 2 if text contains regexp submatch specifiers (\1 .. \9).
4046  */
4047 static int
4049 {
4050  int result = 0;
4051  const char *p = VARDATA_ANY(replace_text);
4052  const char *p_end = p + VARSIZE_ANY_EXHDR(replace_text);
4053 
4054  while (p < p_end)
4055  {
4056  /* Find next escape char, if any. */
4057  p = memchr(p, '\\', p_end - p);
4058  if (p == NULL)
4059  break;
4060  p++;
4061  /* Note: a backslash at the end doesn't require extra processing. */
4062  if (p < p_end)
4063  {
4064  if (*p >= '1' && *p <= '9')
4065  return 2; /* Found a submatch specifier, so done */
4066  result = 1; /* Found some other sequence, keep looking */
4067  p++;
4068  }
4069  }
4070  return result;
4071 }
4072 
4073 /*
4074  * appendStringInfoRegexpSubstr
4075  *
4076  * Append replace_text to str, substituting regexp back references for
4077  * \n escapes. start_ptr is the start of the match in the source string,
4078  * at logical character position data_pos.
4079  */
4080 static void
4082  regmatch_t *pmatch,
4083  char *start_ptr, int data_pos)
4084 {
4085  const char *p = VARDATA_ANY(replace_text);
4086  const char *p_end = p + VARSIZE_ANY_EXHDR(replace_text);
4087 
4088  while (p < p_end)
4089  {
4090  const char *chunk_start = p;
4091  int so;
4092  int eo;
4093 
4094  /* Find next escape char, if any. */
4095  p = memchr(p, '\\', p_end - p);
4096  if (p == NULL)
4097  p = p_end;
4098 
4099  /* Copy the text we just scanned over, if any. */
4100  if (p > chunk_start)
4101  appendBinaryStringInfo(str, chunk_start, p - chunk_start);
4102 
4103  /* Done if at end of string, else advance over escape char. */
4104  if (p >= p_end)
4105  break;
4106  p++;
4107 
4108  if (p >= p_end)
4109  {
4110  /* Escape at very end of input. Treat same as unexpected char */
4111  appendStringInfoChar(str, '\\');
4112  break;
4113  }
4114 
4115  if (*p >= '1' && *p <= '9')
4116  {
4117  /* Use the back reference of regexp. */
4118  int idx = *p - '0';
4119 
4120  so = pmatch[idx].rm_so;
4121  eo = pmatch[idx].rm_eo;
4122  p++;
4123  }
4124  else if (*p == '&')
4125  {
4126  /* Use the entire matched string. */
4127  so = pmatch[0].rm_so;
4128  eo = pmatch[0].rm_eo;
4129  p++;
4130  }
4131  else if (*p == '\\')
4132  {
4133  /* \\ means transfer one \ to output. */
4134  appendStringInfoChar(str, '\\');
4135  p++;
4136  continue;
4137  }
4138  else
4139  {
4140  /*
4141  * If escape char is not followed by any expected char, just treat
4142  * it as ordinary data to copy. (XXX would it be better to throw
4143  * an error?)
4144  */
4145  appendStringInfoChar(str, '\\');
4146  continue;
4147  }
4148 
4149  if (so >= 0 && eo >= 0)
4150  {
4151  /*
4152  * Copy the text that is back reference of regexp. Note so and eo
4153  * are counted in characters not bytes.
4154  */
4155  char *chunk_start;
4156  int chunk_len;
4157 
4158  Assert(so >= data_pos);
4159  chunk_start = start_ptr;
4160  chunk_start += charlen_to_bytelen(chunk_start, so - data_pos);
4161  chunk_len = charlen_to_bytelen(chunk_start, eo - so);
4162  appendBinaryStringInfo(str, chunk_start, chunk_len);
4163  }
4164  }
4165 }
4166 
4167 /*
4168  * replace_text_regexp
4169  *
4170  * replace substring(s) in src_text that match pattern with replace_text.
4171  * The replace_text can contain backslash markers to substitute
4172  * (parts of) the matched text.
4173  *
4174  * cflags: regexp compile flags.
4175  * collation: collation to use.
4176  * search_start: the character (not byte) offset in src_text at which to
4177  * begin searching.
4178  * n: if 0, replace all matches; if > 0, replace only the N'th match.
4179  */
4180 text *
4181 replace_text_regexp(text *src_text, text *pattern_text,
4182  text *replace_text,
4183  int cflags, Oid collation,
4184  int search_start, int n)
4185 {
4186  text *ret_text;
4187  regex_t *re;
4188  int src_text_len = VARSIZE_ANY_EXHDR(src_text);
4189  int nmatches = 0;
4191  regmatch_t pmatch[10]; /* main match, plus \1 to \9 */
4192  int nmatch = lengthof(pmatch);
4193  pg_wchar *data;
4194  size_t data_len;
4195  int data_pos;
4196  char *start_ptr;
4197  int escape_status;
4198 
4199  initStringInfo(&buf);
4200 
4201  /* Convert data string to wide characters. */
4202  data = (pg_wchar *) palloc((src_text_len + 1) * sizeof(pg_wchar));
4203  data_len = pg_mb2wchar_with_len(VARDATA_ANY(src_text), data, src_text_len);
4204 
4205  /* Check whether replace_text has escapes, especially regexp submatches. */
4207 
4208  /* If no regexp submatches, we can use REG_NOSUB. */
4209  if (escape_status < 2)
4210  {
4211  cflags |= REG_NOSUB;
4212  /* Also tell pg_regexec we only want the whole-match location. */
4213  nmatch = 1;
4214  }
4215 
4216  /* Prepare the regexp. */
4217  re = RE_compile_and_cache(pattern_text, cflags, collation);
4218 
4219  /* start_ptr points to the data_pos'th character of src_text */
4220  start_ptr = (char *) VARDATA_ANY(src_text);
4221  data_pos = 0;
4222 
4223  while (search_start <= data_len)
4224  {
4225  int regexec_result;
4226 
4228 
4229  regexec_result = pg_regexec(re,
4230  data,
4231  data_len,
4232  search_start,
4233  NULL, /* no details */
4234  nmatch,
4235  pmatch,
4236  0);
4237 
4238  if (regexec_result == REG_NOMATCH)
4239  break;
4240 
4241  if (regexec_result != REG_OKAY)
4242  {
4243  char errMsg[100];
4244 
4245  pg_regerror(regexec_result, re, errMsg, sizeof(errMsg));
4246  ereport(ERROR,
4247  (errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
4248  errmsg("regular expression failed: %s", errMsg)));
4249  }
4250 
4251  /*
4252  * Count matches, and decide whether to replace this match.
4253  */
4254  nmatches++;
4255  if (n > 0 && nmatches != n)
4256  {
4257  /*
4258  * No, so advance search_start, but not start_ptr/data_pos. (Thus,
4259  * we treat the matched text as if it weren't matched, and copy it
4260  * to the output later.)
4261  */
4262  search_start = pmatch[0].rm_eo;
4263  if (pmatch[0].rm_so == pmatch[0].rm_eo)
4264  search_start++;
4265  continue;
4266  }
4267 
4268  /*
4269  * Copy the text to the left of the match position. Note we are given
4270  * character not byte indexes.
4271  */
4272  if (pmatch[0].rm_so - data_pos > 0)
4273  {
4274  int chunk_len;
4275 
4276  chunk_len = charlen_to_bytelen(start_ptr,
4277  pmatch[0].rm_so - data_pos);
4278  appendBinaryStringInfo(&buf, start_ptr, chunk_len);
4279 
4280  /*
4281  * Advance start_ptr over that text, to avoid multiple rescans of
4282  * it if the replace_text contains multiple back-references.
4283  */
4284  start_ptr += chunk_len;
4285  data_pos = pmatch[0].rm_so;
4286  }
4287 
4288  /*
4289  * Copy the replace_text, processing escapes if any are present.
4290  */
4291  if (escape_status > 0)
4293  start_ptr, data_pos);
4294  else
4296 
4297  /* Advance start_ptr and data_pos over the matched text. */
4298  start_ptr += charlen_to_bytelen(start_ptr,
4299  pmatch[0].rm_eo - data_pos);
4300  data_pos = pmatch[0].rm_eo;
4301 
4302  /*
4303  * If we only want to replace one occurrence, we're done.
4304  */
4305  if (n > 0)
4306  break;
4307 
4308  /*
4309  * Advance search position. Normally we start the next search at the
4310  * end of the previous match; but if the match was of zero length, we
4311  * have to advance by one character, or we'd just find the same match
4312  * again.
4313  */
4314  search_start = data_pos;
4315  if (pmatch[0].rm_so == pmatch[0].rm_eo)
4316  search_start++;
4317  }
4318 
4319  /*
4320  * Copy the text to the right of the last match.
4321  */
4322  if (data_pos < data_len)
4323  {
4324  int chunk_len;
4325 
4326  chunk_len = ((char *) src_text + VARSIZE_ANY(src_text)) - start_ptr;
4327  appendBinaryStringInfo(&buf, start_ptr, chunk_len);
4328  }
4329 
4330  ret_text = cstring_to_text_with_len(buf.data, buf.len);
4331  pfree(buf.data);
4332  pfree(data);
4333 
4334  return ret_text;
4335 }
4336 
4337 /*
4338  * split_part
4339  * parse input string based on provided field separator
4340  * return N'th item (1 based, negative counts from end)
4341  */
4342 Datum
4344 {
4345  text *inputstring = PG_GETARG_TEXT_PP(0);
4346  text *fldsep = PG_GETARG_TEXT_PP(1);
4347  int fldnum = PG_GETARG_INT32(2);
4348  int inputstring_len;
4349  int fldsep_len;
4351  char *start_ptr;
4352  char *end_ptr;
4353  text *result_text;
4354  bool found;
4355 
4356  /* field number is 1 based */
4357  if (fldnum == 0)
4358  ereport(ERROR,
4359  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
4360  errmsg("field position must not be zero")));
4361 
4362  inputstring_len = VARSIZE_ANY_EXHDR(inputstring);
4363  fldsep_len = VARSIZE_ANY_EXHDR(fldsep);
4364 
4365  /* return empty string for empty input string */
4366  if (inputstring_len < 1)
4368 
4369  /* handle empty field separator */
4370  if (fldsep_len < 1)
4371  {
4372  /* if first or last field, return input string, else empty string */
4373  if (fldnum == 1 || fldnum == -1)
4374  PG_RETURN_TEXT_P(inputstring);
4375  else
4377  }
4378 
4379  /* find the first field separator */
4380  text_position_setup(inputstring, fldsep, PG_GET_COLLATION(), &state);
4381 
4382  found = text_position_next(&state);
4383 
4384  /* special case if fldsep not found at all */
4385  if (!found)
4386  {
4388  /* if first or last field, return input string, else empty string */
4389  if (fldnum == 1 || fldnum == -1)
4390  PG_RETURN_TEXT_P(inputstring);
4391  else
4393  }
4394 
4395  /*
4396  * take care of a negative field number (i.e. count from the right) by
4397  * converting to a positive field number; we need total number of fields
4398  */
4399  if (fldnum < 0)
4400  {
4401  /* we found a fldsep, so there are at least two fields */
4402  int numfields = 2;
4403 
4404  while (text_position_next(&state))
4405  numfields++;
4406 
4407  /* special case of last field does not require an extra pass */
4408  if (fldnum == -1)
4409  {
4410  start_ptr = text_position_get_match_ptr(&state) + fldsep_len;
4411  end_ptr = VARDATA_ANY(inputstring) + inputstring_len;
4414  end_ptr - start_ptr));
4415  }
4416 
4417  /* else, convert fldnum to positive notation */
4418  fldnum += numfields + 1;
4419 
4420  /* if nonexistent field, return empty string */
4421  if (fldnum <= 0)
4422  {
4425  }
4426 
4427  /* reset to pointing at first match, but now with positive fldnum */
4429  found = text_position_next(&state);
4430  Assert(found);
4431  }
4432 
4433  /* identify bounds of first field */
4434  start_ptr = VARDATA_ANY(inputstring);
4435  end_ptr = text_position_get_match_ptr(&state);
4436 
4437  while (found && --fldnum > 0)
4438  {
4439  /* identify bounds of next field */
4440  start_ptr = end_ptr + fldsep_len;
4441  found = text_position_next(&state);
4442  if (found)
4443  end_ptr = text_position_get_match_ptr(&state);
4444  }
4445 
4447 
4448  if (fldnum > 0)
4449  {
4450  /* N'th field separator not found */
4451  /* if last field requested, return it, else empty string */
4452  if (fldnum == 1)
4453  {
4454  int last_len = start_ptr - VARDATA_ANY(inputstring);
4455 
4456  result_text = cstring_to_text_with_len(start_ptr,
4457  inputstring_len - last_len);
4458  }
4459  else
4460  result_text = cstring_to_text("");
4461  }
4462  else
4463  {
4464  /* non-last field requested */
4465  result_text = cstring_to_text_with_len(start_ptr, end_ptr - start_ptr);
4466  }
4467 
4468  PG_RETURN_TEXT_P(result_text);
4469 }
4470 
4471 /*
4472  * Convenience function to return true when two text params are equal.
4473  */
4474 static bool
4476 {
4478  collid,
4479  PointerGetDatum(txt1),
4480  PointerGetDatum(txt2)));
4481 }
4482 
4483 /*
4484  * text_to_array
4485  * parse input string and return text array of elements,
4486  * based on provided field separator
4487  */
4488 Datum
4490 {
4491  SplitTextOutputData tstate;
4492 
4493  /* For array output, tstate should start as all zeroes */
4494  memset(&tstate, 0, sizeof(tstate));
4495 
4496  if (!split_text(fcinfo, &tstate))
4497  PG_RETURN_NULL();
4498 
4499  if (tstate.astate == NULL)
4501 
4504 }
4505 
4506 /*
4507  * text_to_array_null
4508  * parse input string and return text array of elements,
4509  * based on provided field separator and null string
4510  *
4511  * This is a separate entry point only to prevent the regression tests from
4512  * complaining about different argument sets for the same internal function.
4513  */
4514 Datum
4516 {
4517  return text_to_array(fcinfo);
4518 }
4519 
4520 /*
4521  * text_to_table
4522  * parse input string and return table of elements,
4523  * based on provided field separator
4524  */
4525 Datum
4527 {
4528  ReturnSetInfo *rsi = (ReturnSetInfo *) fcinfo->resultinfo;
4529  SplitTextOutputData tstate;
4530 
4531  tstate.astate = NULL;
4533  tstate.tupstore = rsi->setResult;
4534  tstate.tupdesc = rsi->setDesc;
4535 
4536  (void) split_text(fcinfo, &tstate);
4537 
4538  return (Datum) 0;
4539 }
4540 
4541 /*
4542  * text_to_table_null
4543  * parse input string and return table of elements,
4544  * based on provided field separator and null string
4545  *
4546  * This is a separate entry point only to prevent the regression tests from
4547  * complaining about different argument sets for the same internal function.
4548  */
4549 Datum
4551 {
4552  return text_to_table(fcinfo);
4553 }
4554 
4555 /*
4556  * Common code for text_to_array, text_to_array_null, text_to_table
4557  * and text_to_table_null functions.
4558  *
4559  * These are not strict so we have to test for null inputs explicitly.
4560  * Returns false if result is to be null, else returns true.
4561  *
4562  * Note that if the result is valid but empty (zero elements), we return
4563  * without changing *tstate --- caller must handle that case, too.
4564  */
4565 static bool
4567 {
4568  text *inputstring;
4569  text *fldsep;
4570  text *null_string;
4571  Oid collation = PG_GET_COLLATION();
4572  int inputstring_len;
4573  int fldsep_len;
4574  char *start_ptr;
4575  text *result_text;
4576 
4577  /* when input string is NULL, then result is NULL too */
4578  if (PG_ARGISNULL(0))
4579  return false;
4580 
4581  inputstring = PG_GETARG_TEXT_PP(0);
4582 
4583  /* fldsep can be NULL */
4584  if (!PG_ARGISNULL(1))
4585  fldsep = PG_GETARG_TEXT_PP(1);
4586  else
4587  fldsep = NULL;
4588 
4589  /* null_string can be NULL or omitted */
4590  if (PG_NARGS() > 2 && !PG_ARGISNULL(2))
4591  null_string = PG_GETARG_TEXT_PP(2);
4592  else
4593  null_string = NULL;
4594 
4595  if (fldsep != NULL)
4596  {
4597  /*
4598  * Normal case with non-null fldsep. Use the text_position machinery
4599  * to search for occurrences of fldsep.
4600  */
4602 
4603  inputstring_len = VARSIZE_ANY_EXHDR(inputstring);
4604  fldsep_len = VARSIZE_ANY_EXHDR(fldsep);
4605 
4606  /* return empty set for empty input string */
4607  if (inputstring_len < 1)
4608  return true;
4609 
4610  /* empty field separator: return input string as a one-element set */
4611  if (fldsep_len < 1)
4612  {
4613  split_text_accum_result(tstate, inputstring,
4614  null_string, collation);
4615  return true;
4616  }
4617 
4618  text_position_setup(inputstring, fldsep, collation, &state);
4619 
4620  start_ptr = VARDATA_ANY(inputstring);
4621 
4622  for (;;)
4623  {
4624  bool found;
4625  char *end_ptr;
4626  int chunk_len;
4627 
4629 
4630  found = text_position_next(&state);
4631  if (!found)
4632  {
4633  /* fetch last field */
4634  chunk_len = ((char *) inputstring + VARSIZE_ANY(inputstring)) - start_ptr;
4635  end_ptr = NULL; /* not used, but some compilers complain */
4636  }
4637  else
4638  {
4639  /* fetch non-last field */
4640  end_ptr = text_position_get_match_ptr(&state);
4641  chunk_len = end_ptr - start_ptr;
4642  }
4643 
4644  /* build a temp text datum to pass to split_text_accum_result */
4645  result_text = cstring_to_text_with_len(start_ptr, chunk_len);
4646 
4647  /* stash away this field */
4648  split_text_accum_result(tstate, result_text,
4649  null_string, collation);
4650 
4651  pfree(result_text);
4652 
4653  if (!found)
4654  break;
4655 
4656  start_ptr = end_ptr + fldsep_len;
4657  }
4658 
4660  }
4661  else
4662  {
4663  /*
4664  * When fldsep is NULL, each character in the input string becomes a
4665  * separate element in the result set. The separator is effectively
4666  * the space between characters.
4667  */
4668  inputstring_len = VARSIZE_ANY_EXHDR(inputstring);
4669 
4670  start_ptr = VARDATA_ANY(inputstring);
4671 
4672  while (inputstring_len > 0)
4673  {
4674  int chunk_len = pg_mblen(start_ptr);
4675 
4677 
4678  /* build a temp text datum to pass to split_text_accum_result */
4679  result_text = cstring_to_text_with_len(start_ptr, chunk_len);
4680 
4681  /* stash away this field */
4682  split_text_accum_result(tstate, result_text,
4683  null_string, collation);
4684 
4685  pfree(result_text);
4686 
4687  start_ptr += chunk_len;
4688  inputstring_len -= chunk_len;
4689  }
4690  }
4691 
4692  return true;
4693 }
4694 
4695 /*
4696  * Add text item to result set (table or array).
4697  *
4698  * This is also responsible for checking to see if the item matches
4699  * the null_string, in which case we should emit NULL instead.
4700  */
4701 static void
4703  text *field_value,
4704  text *null_string,
4705  Oid collation)
4706 {
4707  bool is_null = false;
4708 
4709  if (null_string && text_isequal(field_value, null_string, collation))
4710  is_null = true;
4711 
4712  if (tstate->tupstore)
4713  {
4714  Datum values[1];
4715  bool nulls[1];
4716 
4717  values[0] = PointerGetDatum(field_value);
4718  nulls[0] = is_null;
4719 
4721  tstate->tupdesc,
4722  values,
4723  nulls);
4724  }
4725  else
4726  {
4727  tstate->astate = accumArrayResult(tstate->astate,
4728  PointerGetDatum(field_value),
4729  is_null,
4730  TEXTOID,
4732  }
4733 }
4734 
4735 /*
4736  * array_to_text
4737  * concatenate Cstring representation of input array elements
4738  * using provided field separator
4739  */
4740 Datum
4742 {
4744  char *fldsep = text_to_cstring(PG_GETARG_TEXT_PP(1));
4745 
4746  PG_RETURN_TEXT_P(array_to_text_internal(fcinfo, v, fldsep, NULL));
4747 }
4748 
4749 /*
4750  * array_to_text_null
4751  * concatenate Cstring representation of input array elements
4752  * using provided field separator and null string
4753  *
4754  * This version is not strict so we have to test for null inputs explicitly.
4755  */
4756 Datum
4758 {
4759  ArrayType *v;
4760  char *fldsep;
4761  char *null_string;
4762 
4763  /* returns NULL when first or second parameter is NULL */
4764  if (PG_ARGISNULL(0) || PG_ARGISNULL(1))
4765  PG_RETURN_NULL();
4766 
4767  v = PG_GETARG_ARRAYTYPE_P(0);
4768  fldsep = text_to_cstring(PG_GETARG_TEXT_PP(1));
4769 
4770  /* NULL null string is passed through as a null pointer */
4771  if (!PG_ARGISNULL(2))
4772  null_string = text_to_cstring(PG_GETARG_TEXT_PP(2));
4773  else
4774  null_string = NULL;
4775 
4776  PG_RETURN_TEXT_P(array_to_text_internal(fcinfo, v, fldsep, null_string));
4777 }
4778 
4779 /*
4780  * common code for array_to_text and array_to_text_null functions
4781  */
4782 static text *
4784  const char *fldsep, const char *null_string)
4785 {
4786  text *result;
4787  int nitems,
4788  *dims,
4789  ndims;
4790  Oid element_type;
4791  int typlen;
4792  bool typbyval;
4793  char typalign;
4795  bool printed = false;
4796  char *p;
4797  bits8 *bitmap;
4798  int bitmask;
4799  int i;
4800  ArrayMetaState *my_extra;
4801 
4802  ndims = ARR_NDIM(v);
4803  dims = ARR_DIMS(v);
4804  nitems = ArrayGetNItems(ndims, dims);
4805 
4806  /* if there are no elements, return an empty string */
4807  if (nitems == 0)
4808  return cstring_to_text_with_len("", 0);
4809 
4810  element_type = ARR_ELEMTYPE(v);
4811  initStringInfo(&buf);
4812 
4813  /*
4814  * We arrange to look up info about element type, including its output
4815  * conversion proc, only once per series of calls, assuming the element
4816  * type doesn't change underneath us.
4817  */
4818  my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
4819  if (my_extra == NULL)
4820  {
4821  fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
4822  sizeof(ArrayMetaState));
4823  my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
4824  my_extra->element_type = ~element_type;
4825  }
4826 
4827  if (my_extra->element_type != element_type)
4828  {
4829  /*
4830  * Get info about element type, including its output conversion proc
4831  */
4832  get_type_io_data(element_type, IOFunc_output,
4833  &my_extra->typlen, &my_extra->typbyval,
4834  &my_extra->typalign, &my_extra->typdelim,
4835  &my_extra->typioparam, &my_extra->typiofunc);
4836  fmgr_info_cxt(my_extra->typiofunc, &my_extra->proc,
4837  fcinfo->flinfo->fn_mcxt);
4838  my_extra->element_type = element_type;
4839  }
4840  typlen = my_extra->typlen;
4841  typbyval = my_extra->typbyval;
4842  typalign = my_extra->typalign;
4843 
4844  p = ARR_DATA_PTR(v);
4845  bitmap = ARR_NULLBITMAP(v);
4846  bitmask = 1;
4847 
4848  for (i = 0; i < nitems; i++)
4849  {
4850  Datum itemvalue;
4851  char *value;
4852 
4853  /* Get source element, checking for NULL */
4854  if (bitmap && (*bitmap & bitmask) == 0)
4855  {
4856  /* if null_string is NULL, we just ignore null elements */
4857  if (null_string != NULL)
4858  {
4859  if (printed)
4860  appendStringInfo(&buf, "%s%s", fldsep, null_string);
4861  else
4862  appendStringInfoString(&buf, null_string);
4863  printed = true;
4864  }
4865  }
4866  else
4867  {
4868  itemvalue = fetch_att(p, typbyval, typlen);
4869 
4870  value = OutputFunctionCall(&my_extra->proc, itemvalue);
4871 
4872  if (printed)
4873  appendStringInfo(&buf, "%s%s", fldsep, value);
4874  else
4876  printed = true;
4877 
4878  p = att_addlength_pointer(p, typlen, p);
4879  p = (char *) att_align_nominal(p, typalign);
4880  }
4881 
4882  /* advance bitmap pointer if any */
4883  if (bitmap)
4884  {
4885  bitmask <<= 1;
4886  if (bitmask == 0x100)
4887  {
4888  bitmap++;
4889  bitmask = 1;
4890  }
4891  }
4892  }
4893 
4894  result = cstring_to_text_with_len(buf.data, buf.len);
4895  pfree(buf.data);
4896 
4897  return result;
4898 }
4899 
4900 /*
4901  * Workhorse for to_bin, to_oct, and to_hex. Note that base must be > 1 and <=
4902  * 16.
4903  */
4904 static inline text *
4905 convert_to_base(uint64 value, int base)
4906 {
4907  const char *digits = "0123456789abcdef";
4908 
4909  /* We size the buffer for to_bin's longest possible return value. */
4910  char buf[sizeof(uint64) * BITS_PER_BYTE];
4911  char *const end = buf + sizeof(buf);
4912  char *ptr = end;
4913 
4914  Assert(base > 1);
4915  Assert(base <= 16);
4916 
4917  do
4918  {
4919  *--ptr = digits[value % base];
4920  value /= base;
4921  } while (ptr > buf && value);
4922 
4923  return cstring_to_text_with_len(ptr, end - ptr);
4924 }
4925 
4926 /*
4927  * Convert an integer to a string containing a base-2 (binary) representation
4928  * of the number.
4929  */
4930 Datum
4932 {
4933  uint64 value = (uint32) PG_GETARG_INT32(0);
4934 
4936 }
4937 Datum
4939 {
4940  uint64 value = (uint64) PG_GETARG_INT64(0);
4941 
4943 }
4944 
4945 /*
4946  * Convert an integer to a string containing a base-8 (oct) representation of
4947  * the number.
4948  */
4949 Datum
4951 {
4952  uint64 value = (uint32) PG_GETARG_INT32(0);
4953 
4955 }
4956 Datum
4958 {
4959  uint64 value = (uint64) PG_GETARG_INT64(0);
4960 
4962 }
4963 
4964 /*
4965  * Convert an integer to a string containing a base-16 (hex) representation of
4966  * the number.
4967  */
4968 Datum
4970 {
4971  uint64 value = (uint32) PG_GETARG_INT32(0);
4972 
4974 }
4975 Datum
4977 {
4978  uint64 value = (uint64) PG_GETARG_INT64(0);
4979 
4981 }
4982 
4983 /*
4984  * Return the size of a datum, possibly compressed
4985  *
4986  * Works on any data type
4987  */
4988 Datum
4990 {
4992  int32 result;
4993  int typlen;
4994 
4995  /* On first call, get the input type's typlen, and save at *fn_extra */
4996  if (fcinfo->flinfo->fn_extra == NULL)
4997  {
4998  /* Lookup the datatype of the supplied argument */
4999  Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0);
5000 
5001  typlen = get_typlen(argtypeid);
5002  if (typlen == 0) /* should not happen */
5003  elog(ERROR, "cache lookup failed for type %u", argtypeid);
5004 
5005  fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
5006  sizeof(int));
5007  *((int *) fcinfo->flinfo->fn_extra) = typlen;
5008  }
5009  else
5010  typlen = *((int *) fcinfo->flinfo->fn_extra);
5011 
5012  if (typlen == -1)
5013  {
5014  /* varlena type, possibly toasted */
5015  result = toast_datum_size(value);
5016  }
5017  else if (typlen == -2)
5018  {
5019  /* cstring */
5020  result = strlen(DatumGetCString(value)) + 1;
5021  }
5022  else
5023  {
5024  /* ordinary fixed-width type */
5025  result = typlen;
5026  }
5027 
5028  PG_RETURN_INT32(result);
5029 }
5030 
5031 /*
5032  * Return the compression method stored in the compressed attribute. Return
5033  * NULL for non varlena type or uncompressed data.
5034  */
5035 Datum
5037 {
5038  int typlen;
5039  char *result;
5040  ToastCompressionId cmid;
5041 
5042  /* On first call, get the input type's typlen, and save at *fn_extra */
5043  if (fcinfo->flinfo->fn_extra == NULL)
5044  {
5045  /* Lookup the datatype of the supplied argument */
5046  Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0);
5047 
5048  typlen = get_typlen(argtypeid);
5049  if (typlen == 0) /* should not happen */
5050  elog(ERROR, "cache lookup failed for type %u", argtypeid);
5051 
5052  fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
5053  sizeof(int));
5054  *((int *) fcinfo->flinfo->fn_extra) = typlen;
5055  }
5056  else
5057  typlen = *((int *) fcinfo->flinfo->fn_extra);
5058 
5059  if (typlen != -1)
5060  PG_RETURN_NULL();
5061 
5062  /* get the compression method id stored in the compressed varlena */
5063  cmid = toast_get_compression_id((struct varlena *)
5065  if (cmid == TOAST_INVALID_COMPRESSION_ID)
5066  PG_RETURN_NULL();
5067 
5068  /* convert compression method id to compression method name */
5069  switch (cmid)
5070  {
5072  result = "pglz";
5073  break;
5075  result = "lz4";
5076  break;
5077  default:
5078  elog(ERROR, "invalid compression method id %d", cmid);
5079  }
5080 
5082 }
5083 
5084 /*
5085  * Return the chunk_id of the on-disk TOASTed value. Return NULL if the value
5086  * is un-TOASTed or not on-disk.
5087  */
5088 Datum
5090 {
5091  int typlen;
5092  struct varlena *attr;
5093  struct varatt_external toast_pointer;
5094 
5095  /* On first call, get the input type's typlen, and save at *fn_extra */
5096  if (fcinfo->flinfo->fn_extra == NULL)
5097  {
5098  /* Lookup the datatype of the supplied argument */
5099  Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0);
5100 
5101  typlen = get_typlen(argtypeid);
5102  if (typlen == 0) /* should not happen */
5103  elog(ERROR, "cache lookup failed for type %u", argtypeid);
5104 
5105  fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
5106  sizeof(int));
5107  *((int *) fcinfo->flinfo->fn_extra) = typlen;
5108  }
5109  else
5110  typlen = *((int *) fcinfo->flinfo->fn_extra);
5111 
5112  if (typlen != -1)
5113  PG_RETURN_NULL();
5114 
5115  attr = (struct varlena *) DatumGetPointer(PG_GETARG_DATUM(0));
5116 
5117  if (!VARATT_IS_EXTERNAL_ONDISK(attr))
5118  PG_RETURN_NULL();
5119 
5120  VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr);
5121 
5122  PG_RETURN_OID(toast_pointer.va_valueid);
5123 }
5124 
5125 /*
5126  * string_agg - Concatenates values and returns string.
5127  *
5128  * Syntax: string_agg(value text, delimiter text) RETURNS text
5129  *
5130  * Note: Any NULL values are ignored. The first-call delimiter isn't
5131  * actually used at all, and on subsequent calls the delimiter precedes
5132  * the associated value.
5133  */
5134 
5135 /* subroutine to initialize state */
5136 static StringInfo
5138 {
5139  StringInfo state;
5140  MemoryContext aggcontext;
5141  MemoryContext oldcontext;
5142 
5143  if (!AggCheckCallContext(fcinfo, &aggcontext))
5144  {
5145  /* cannot be called directly because of internal-type argument */
5146  elog(ERROR, "string_agg_transfn called in non-aggregate context");
5147  }
5148 
5149  /*
5150  * Create state in aggregate context. It'll stay there across subsequent
5151  * calls.
5152  */
5153  oldcontext = MemoryContextSwitchTo(aggcontext);
5154  state = makeStringInfo();
5155  MemoryContextSwitchTo(oldcontext);
5156 
5157  return state;
5158 }
5159 
5160 Datum
5162 {
5163  StringInfo state;
5164 
5165  state = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
5166 
5167  /* Append the value unless null, preceding it with the delimiter. */
5168  if (!PG_ARGISNULL(1))
5169  {
5171  bool isfirst = false;
5172 
5173  /*
5174  * You might think we can just throw away the first delimiter, however
5175  * we must keep it as we may be a parallel worker doing partial
5176  * aggregation building a state to send to the main process. We need
5177  * to keep the delimiter of every aggregation so that the combine
5178  * function can properly join up the strings of two separately
5179  * partially aggregated results. The first delimiter is only stripped
5180  * off in the final function. To know how much to strip off the front
5181  * of the string, we store the length of the first delimiter in the
5182  * StringInfo's cursor field, which we don't otherwise need here.
5183  */
5184  if (state == NULL)
5185  {
5186  state = makeStringAggState(fcinfo);
5187  isfirst = true;
5188  }
5189 
5190  if (!PG_ARGISNULL(2))
5191  {
5192  text *delim = PG_GETARG_TEXT_PP(2);
5193 
5194  appendStringInfoText(state, delim);
5195  if (isfirst)
5196  state->cursor = VARSIZE_ANY_EXHDR(delim);
5197  }
5198 
5200  }
5201 
5202  /*
5203  * The transition type for string_agg() is declared to be "internal",
5204  * which is a pass-by-value type the same size as a pointer.
5205  */
5206  if (state)
5208  PG_RETURN_NULL();
5209 }
5210 
5211 /*
5212  * string_agg_combine
5213  * Aggregate combine function for string_agg(text) and string_agg(bytea)
5214  */
5215 Datum
5217 {
5218  StringInfo state1;
5219  StringInfo state2;
5220  MemoryContext agg_context;
5221 
5222  if (!AggCheckCallContext(fcinfo, &agg_context))
5223  elog(ERROR, "aggregate function called in non-aggregate context");
5224 
5225  state1 = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
5226  state2 = PG_ARGISNULL(1) ? NULL : (StringInfo) PG_GETARG_POINTER(1);
5227 
5228  if (state2 == NULL)
5229  {
5230  /*
5231  * NULL state2 is easy, just return state1, which we know is already
5232  * in the agg_context
5233  */
5234  if (state1 == NULL)
5235  PG_RETURN_NULL();
5236  PG_RETURN_POINTER(state1);
5237  }
5238 
5239  if (state1 == NULL)
5240  {
5241  /* We must copy state2's data into the agg_context */
5242  MemoryContext old_context;
5243 
5244  old_context = MemoryContextSwitchTo(agg_context);
5245  state1 = makeStringAggState(fcinfo);
5246  appendBinaryStringInfo(state1, state2->data, state2->len);
5247  state1->cursor = state2->cursor;
5248  MemoryContextSwitchTo(old_context);
5249  }
5250  else if (state2->len > 0)
5251  {
5252  /* Combine ... state1->cursor does not change in this case */
5253  appendBinaryStringInfo(state1, state2->data, state2->len);
5254  }
5255 
5256  PG_RETURN_POINTER(state1);
5257 }
5258 
5259 /*
5260  * string_agg_serialize
5261  * Aggregate serialize function for string_agg(text) and string_agg(bytea)
5262  *
5263  * This is strict, so we need not handle NULL input
5264  */
5265 Datum
5267 {
5268  StringInfo state;
5270  bytea *result;
5271 
5272  /* cannot be called directly because of internal-type argument */
5273  Assert(AggCheckCallContext(fcinfo, NULL));
5274 
5276 
5277  pq_begintypsend(&buf);
5278 
5279  /* cursor */
5280  pq_sendint(&buf, state->cursor, 4);
5281 
5282  /* data */
5283  pq_sendbytes(&buf, state->data, state->len);
5284 
5285  result = pq_endtypsend(&buf);
5286 
5287  PG_RETURN_BYTEA_P(result);
5288 }
5289 
5290 /*
5291  * string_agg_deserialize
5292  * Aggregate deserial function for string_agg(text) and string_agg(bytea)
5293  *
5294  * This is strict, so we need not handle NULL input
5295  */
5296 Datum
5298 {
5299  bytea *sstate;
5300  StringInfo result;
5302  char *data;
5303  int datalen;
5304 
5305  /* cannot be called directly because of internal-type argument */
5306  Assert(AggCheckCallContext(fcinfo, NULL));
5307 
5308  sstate = PG_GETARG_BYTEA_PP(0);
5309 
5310  /*
5311  * Initialize a StringInfo so that we can "receive" it using the standard
5312  * recv-function infrastructure.
5313  */
5315  VARSIZE_ANY_EXHDR(sstate));
5316 
5317  result = makeStringAggState(fcinfo);
5318 
5319  /* cursor */
5320  result->cursor = pq_getmsgint(&buf, 4);
5321 
5322  /* data */
5323  datalen = VARSIZE_ANY_EXHDR(sstate) - 4;
5324  data = (char *) pq_getmsgbytes(&buf, datalen);
5325  appendBinaryStringInfo(result, data, datalen);
5326 
5327  pq_getmsgend(&buf);
5328 
5329  PG_RETURN_POINTER(result);
5330 }
5331 
5332 Datum
5334 {
5335  StringInfo state;
5336 
5337  /* cannot be called directly because of internal-type argument */
5338  Assert(AggCheckCallContext(fcinfo, NULL));
5339 
5340  state = PG_ARGISNULL(0) ? NULL : (StringInfo) PG_GETARG_POINTER(0);
5341 
5342  if (state != NULL)
5343  {
5344  /* As per comment in transfn, strip data before the cursor position */
5346  state->len - state->cursor));
5347  }
5348  else
5349  PG_RETURN_NULL();
5350 }
5351 
5352 /*
5353  * Prepare cache with fmgr info for the output functions of the datatypes of
5354  * the arguments of a concat-like function, beginning with argument "argidx".
5355  * (Arguments before that will have corresponding slots in the resulting
5356  * FmgrInfo array, but we don't fill those slots.)
5357  */
5358 static FmgrInfo *
5360 {
5361  FmgrInfo *foutcache;
5362  int i;
5363 
5364  /* We keep the info in fn_mcxt so it survives across calls */
5365  foutcache = (FmgrInfo *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
5366  PG_NARGS() * sizeof(FmgrInfo));
5367 
5368  for (i = argidx; i < PG_NARGS(); i++)
5369  {
5370  Oid valtype;
5371  Oid typOutput;
5372  bool typIsVarlena;
5373 
5374  valtype = get_fn_expr_argtype(fcinfo->flinfo, i);
5375  if (!OidIsValid(valtype))
5376  elog(ERROR, "could not determine data type of concat() input");
5377 
5378  getTypeOutputInfo(valtype, &typOutput, &typIsVarlena);
5379  fmgr_info_cxt(typOutput, &foutcache[i], fcinfo->flinfo->fn_mcxt);
5380  }
5381 
5382  fcinfo->flinfo->fn_extra = foutcache;
5383 
5384  return foutcache;
5385 }
5386 
5387 /*
5388  * Implementation of both concat() and concat_ws().
5389  *
5390  * sepstr is the separator string to place between values.
5391  * argidx identifies the first argument to concatenate (counting from zero);
5392  * note that this must be constant across any one series of calls.
5393  *
5394  * Returns NULL if result should be NULL, else text value.
5395  */
5396 static text *
5397 concat_internal(const char *sepstr, int argidx,
5398  FunctionCallInfo fcinfo)
5399 {
5400  text *result;
5402  FmgrInfo *foutcache;
5403  bool first_arg = true;
5404  int i;
5405 
5406  /*
5407  * concat(VARIADIC some-array) is essentially equivalent to
5408  * array_to_text(), ie concat the array elements with the given separator.
5409  * So we just pass the case off to that code.
5410  */
5411  if (get_fn_expr_variadic(fcinfo->flinfo))
5412  {
5413  ArrayType *arr;
5414 
5415  /* Should have just the one argument */
5416  Assert(argidx == PG_NARGS() - 1);
5417 
5418  /* concat(VARIADIC NULL) is defined as NULL */
5419  if (PG_ARGISNULL(argidx))
5420  return NULL;
5421 
5422  /*
5423  * Non-null argument had better be an array. We assume that any call
5424  * context that could let get_fn_expr_variadic return true will have
5425  * checked that a VARIADIC-labeled parameter actually is an array. So
5426  * it should be okay to just Assert that it's an array rather than
5427  * doing a full-fledged error check.
5428  */
5430 
5431  /* OK, safe to fetch the array value */
5432  arr = PG_GETARG_ARRAYTYPE_P(argidx);
5433 
5434  /*
5435  * And serialize the array. We tell array_to_text to ignore null
5436  * elements, which matches the behavior of the loop below.
5437  */
5438  return array_to_text_internal(fcinfo, arr, sepstr, NULL);
5439  }
5440 
5441  /* Normal case without explicit VARIADIC marker */
5442  initStringInfo(&str);
5443 
5444  /* Get output function info, building it if first time through */
5445  foutcache = (FmgrInfo *) fcinfo->flinfo->fn_extra;
5446  if (foutcache == NULL)
5447  foutcache = build_concat_foutcache(fcinfo, argidx);
5448 
5449  for (i = argidx; i < PG_NARGS(); i++)
5450  {
5451  if (!PG_ARGISNULL(i))
5452  {
5454 
5455  /* add separator if appropriate */
5456  if (first_arg)
5457  first_arg = false;
5458  else
5459  appendStringInfoString(&str, sepstr);
5460 
5461  /* call the appropriate type output function, append the result */
5463  OutputFunctionCall(&foutcache[i], value));
5464  }
5465  }
5466 
5467  result = cstring_to_text_with_len(str.data, str.len);
5468  pfree(str.data);
5469 
5470  return result;
5471 }
5472 
5473 /*
5474  * Concatenate all arguments. NULL arguments are ignored.
5475  */
5476 Datum
5478 {
5479  text *result;
5480 
5481  result = concat_internal("", 0, fcinfo);
5482  if (result == NULL)
5483  PG_RETURN_NULL();
5484  PG_RETURN_TEXT_P(result);
5485 }
5486 
5487 /*
5488  * Concatenate all but first argument value with separators. The first
5489  * parameter is used as the separator. NULL arguments are ignored.
5490  */
5491 Datum
5493 {
5494  char *sep;
5495  text *result;
5496 
5497  /* return NULL when separator is NULL */
5498  if (PG_ARGISNULL(0))
5499  PG_RETURN_NULL();
5501 
5502  result = concat_internal(sep, 1, fcinfo);
5503  if (result == NULL)
5504  PG_RETURN_NULL();
5505  PG_RETURN_TEXT_P(result);
5506 }
5507 
5508 /*
5509  * Return first n characters in the string. When n is negative,
5510  * return all but last |n| characters.
5511  */
5512 Datum
5514 {
5515  int n = PG_GETARG_INT32(1);
5516 
5517  if (n < 0)
5518  {
5519  text *str = PG_GETARG_TEXT_PP(0);
5520  const char *p = VARDATA_ANY(str);
5521  int len = VARSIZE_ANY_EXHDR(str);
5522  int rlen;
5523 
5524  n = pg_mbstrlen_with_len(p, len) + n;
5525  rlen = pg_mbcharcliplen(p, len, n);
5527  }
5528  else
5530 }
5531 
5532 /*
5533  * Return last n characters in the string. When n is negative,
5534  * return all but first |n| characters.
5535  */
5536 Datum
5538 {
5539  text *str = PG_GETARG_TEXT_PP(0);
5540  const char *p = VARDATA_ANY(str);
5541  int len = VARSIZE_ANY_EXHDR(str);
5542  int n = PG_GETARG_INT32(1);
5543  int off;
5544 
5545  if (n < 0)
5546  n = -n;
5547  else
5548  n = pg_mbstrlen_with_len(p, len) - n;
5549  off = pg_mbcharcliplen(p, len, n);
5550 
5552 }
5553 
5554 /*
5555  * Return reversed string
5556  */
5557 Datum
5559 {
5560  text *str = PG_GETARG_TEXT_PP(0);
5561  const char *p = VARDATA_ANY(str);
5562  int len = VARSIZE_ANY_EXHDR(str);
5563  const char *endp = p + len;
5564  text *result;
5565  char *dst;
5566 
5567  result = palloc(len + VARHDRSZ);
5568  dst = (char *) VARDATA(result) + len;
5569  SET_VARSIZE(result, len + VARHDRSZ);
5570 
5572  {
5573  /* multibyte version */
5574  while (p < endp)
5575  {
5576  int sz;
5577 
5578  sz = pg_mblen(p);
5579  dst -= sz;
5580  memcpy(dst, p, sz);
5581  p += sz;
5582  }
5583  }
5584  else
5585  {
5586  /* single byte version */
5587  while (p < endp)
5588  *(--dst) = *p++;
5589  }
5590 
5591  PG_RETURN_TEXT_P(result);
5592 }
5593 
5594 
5595 /*
5596  * Support macros for text_format()
5597  */
5598 #define TEXT_FORMAT_FLAG_MINUS 0x0001 /* is minus flag present? */
5599 
5600 #define ADVANCE_PARSE_POINTER(ptr,end_ptr) \
5601  do { \
5602  if (++(ptr) >= (end_ptr)) \
5603  ereport(ERROR, \
5604  (errcode(ERRCODE_INVALID_PARAMETER_VALUE), \
5605  errmsg("unterminated format() type specifier"), \
5606  errhint("For a single \"%%\" use \"%%%%\"."))); \
5607  } while (0)
5608 
5609 /*
5610  * Returns a formatted string
5611  */
5612 Datum
5614 {
5615  text *fmt;
5617  const char *cp;
5618  const char *start_ptr;
5619  const char *end_ptr;
5620  text *result;
5621  int arg;
5622  bool funcvariadic;
5623  int nargs;
5624  Datum *elements = NULL;
5625  bool *nulls = NULL;
5626  Oid element_type = InvalidOid;
5627  Oid prev_type = InvalidOid;
5628  Oid prev_width_type = InvalidOid;
5629  FmgrInfo typoutputfinfo;
5630  FmgrInfo typoutputinfo_width;
5631 
5632  /* When format string is null, immediately return null */
5633  if (PG_ARGISNULL(0))
5634  PG_RETURN_NULL();
5635 
5636  /* If argument is marked VARIADIC, expand array into elements */
5637  if (get_fn_expr_variadic(fcinfo->flinfo))
5638  {
5639  ArrayType *arr;
5640  int16 elmlen;
5641  bool elmbyval;
5642  char elmalign;
5643  int nitems;
5644 
5645  /* Should have just the one argument */
5646  Assert(PG_NARGS() == 2);
5647 
5648  /* If argument is NULL, we treat it as zero-length array */
5649  if (PG_ARGISNULL(1))
5650  nitems = 0;
5651  else
5652  {
5653  /*
5654  * Non-null argument had better be an array. We assume that any
5655  * call context that could let get_fn_expr_variadic return true
5656  * will have checked that a VARIADIC-labeled parameter actually is
5657  * an array. So it should be okay to just Assert that it's an
5658  * array rather than doing a full-fledged error check.
5659  */
5661 
5662  /* OK, safe to fetch the array value */
5663  arr = PG_GETARG_ARRAYTYPE_P(1);
5664 
5665  /* Get info about array element type */
5666  element_type = ARR_ELEMTYPE(arr);
5667  get_typlenbyvalalign(element_type,
5668  &elmlen, &elmbyval, &elmalign);
5669 
5670  /* Extract all array elements */
5671  deconstruct_array(arr, element_type, elmlen, elmbyval, elmalign,
5672  &elements, &nulls, &nitems);
5673  }
5674 
5675  nargs = nitems + 1;
5676  funcvariadic = true;
5677  }
5678  else
5679  {
5680  /* Non-variadic case, we'll process the arguments individually */
5681  nargs = PG_NARGS();
5682  funcvariadic = false;
5683  }
5684 
5685  /* Setup for main loop. */
5686  fmt = PG_GETARG_TEXT_PP(0);
5687  start_ptr = VARDATA_ANY(fmt);
5688  end_ptr = start_ptr + VARSIZE_ANY_EXHDR(fmt);
5689  initStringInfo(&str);
5690  arg = 1; /* next argument position to print */
5691 
5692  /* Scan format string, looking for conversion specifiers. */
5693  for (cp = start_ptr; cp < end_ptr; cp++)
5694  {
5695  int argpos;
5696  int widthpos;
5697  int flags;
5698  int width;
5699  Datum value;
5700  bool isNull;
5701  Oid typid;
5702 
5703  /*
5704  * If it's not the start of a conversion specifier, just copy it to
5705  * the output buffer.
5706  */
5707  if (*cp != '%')
5708  {
5710  continue;
5711  }
5712 
5713  ADVANCE_PARSE_POINTER(cp, end_ptr);
5714 
5715  /* Easy case: %% outputs a single % */
5716  if (*cp == '%')
5717  {
5719  continue;
5720  }
5721 
5722  /* Parse the optional portions of the format specifier */
5723  cp = text_format_parse_format(cp, end_ptr,
5724  &argpos, &widthpos,
5725  &flags, &width);
5726 
5727  /*
5728  * Next we should see the main conversion specifier. Whether or not
5729  * an argument position was present, it's known that at least one
5730  * character remains in the string at this point. Experience suggests
5731  * that it's worth checking that that character is one of the expected
5732  * ones before we try to fetch arguments, so as to produce the least
5733  * confusing response to a mis-formatted specifier.
5734  */
5735  if (strchr("sIL", *cp) == NULL)
5736  ereport(ERROR,
5737  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5738  errmsg("unrecognized format() type specifier \"%.*s\"",
5739  pg_mblen(cp), cp),
5740  errhint("For a single \"%%\" use \"%%%%\".")));
5741 
5742  /* If indirect width was specified, get its value */
5743  if (widthpos >= 0)
5744  {
5745  /* Collect the specified or next argument position */
5746  if (widthpos > 0)
5747  arg = widthpos;
5748  if (arg >= nargs)
5749  ereport(ERROR,
5750  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5751  errmsg("too few arguments for format()")));
5752 
5753  /* Get the value and type of the selected argument */
5754  if (!funcvariadic)
5755  {
5757  isNull = PG_ARGISNULL(arg);
5758  typid = get_fn_expr_argtype(fcinfo->flinfo, arg);
5759  }
5760  else
5761  {
5762  value = elements[arg - 1];
5763  isNull = nulls[arg - 1];
5764  typid = element_type;
5765  }
5766  if (!OidIsValid(typid))
5767  elog(ERROR, "could not determine data type of format() input");
5768 
5769  arg++;
5770 
5771  /* We can treat NULL width the same as zero */
5772  if (isNull)
5773  width = 0;
5774  else if (typid == INT4OID)
5775  width = DatumGetInt32(value);
5776  else if (typid == INT2OID)
5777  width = DatumGetInt16(value);
5778  else
5779  {
5780  /* For less-usual datatypes, convert to text then to int */
5781  char *str;
5782 
5783  if (typid != prev_width_type)
5784  {
5785  Oid typoutputfunc;
5786  bool typIsVarlena;
5787 
5788  getTypeOutputInfo(typid, &typoutputfunc, &typIsVarlena);
5789  fmgr_info(typoutputfunc, &typoutputinfo_width);
5790  prev_width_type = typid;
5791  }
5792 
5793  str = OutputFunctionCall(&typoutputinfo_width, value);
5794 
5795  /* pg_strtoint32 will complain about bad data or overflow */
5796  width = pg_strtoint32(str);
5797 
5798  pfree(str);
5799  }
5800  }
5801 
5802  /* Collect the specified or next argument position */
5803  if (argpos > 0)
5804  arg = argpos;
5805  if (arg >= nargs)
5806  ereport(ERROR,
5807  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5808  errmsg("too few arguments for format()")));
5809 
5810  /* Get the value and type of the selected argument */
5811  if (!funcvariadic)
5812  {
5814  isNull = PG_ARGISNULL(arg);
5815  typid = get_fn_expr_argtype(fcinfo->flinfo, arg);
5816  }
5817  else
5818  {
5819  value = elements[arg - 1];
5820  isNull = nulls[arg - 1];
5821  typid = element_type;
5822  }
5823  if (!OidIsValid(typid))
5824  elog(ERROR, "could not determine data type of format() input");
5825 
5826  arg++;
5827 
5828  /*
5829  * Get the appropriate typOutput function, reusing previous one if
5830  * same type as previous argument. That's particularly useful in the
5831  * variadic-array case, but often saves work even for ordinary calls.
5832  */
5833  if (typid != prev_type)
5834  {
5835  Oid typoutputfunc;
5836  bool typIsVarlena;
5837 
5838  getTypeOutputInfo(typid, &typoutputfunc, &typIsVarlena);
5839  fmgr_info(typoutputfunc, &typoutputfinfo);
5840  prev_type = typid;
5841  }
5842 
5843  /*
5844  * And now we can format the value.
5845  */
5846  switch (*cp)
5847  {
5848  case 's':
5849  case 'I':
5850  case 'L':
5851  text_format_string_conversion(&str, *cp, &typoutputfinfo,
5852  value, isNull,
5853  flags, width);
5854  break;
5855  default:
5856  /* should not get here, because of previous check */
5857  ereport(ERROR,
5858  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5859  errmsg("unrecognized format() type specifier \"%.*s\"",
5860  pg_mblen(cp), cp),
5861  errhint("For a single \"%%\" use \"%%%%\".")));
5862  break;
5863  }
5864  }
5865 
5866  /* Don't need deconstruct_array results anymore. */
5867  if (elements != NULL)
5868  pfree(elements);
5869  if (nulls != NULL)
5870  pfree(nulls);
5871 
5872  /* Generate results. */
5873  result = cstring_to_text_with_len(str.data, str.len);
5874  pfree(str.data);
5875 
5876  PG_RETURN_TEXT_P(result);
5877 }
5878 
5879 /*
5880  * Parse contiguous digits as a decimal number.
5881  *
5882  * Returns true if some digits could be parsed.
5883  * The value is returned into *value, and *ptr is advanced to the next
5884  * character to be parsed.
5885  *
5886  * Note parsing invariant: at least one character is known available before
5887  * string end (end_ptr) at entry, and this is still true at exit.
5888  */
5889 static bool
5890 text_format_parse_digits(const char **ptr, const char *end_ptr, int *value)
5891 {
5892  bool found = false;
5893  const char *cp = *ptr;
5894  int val = 0;
5895 
5896  while (*cp >= '0' && *cp <= '9')
5897  {
5898  int8 digit = (*cp - '0');
5899 
5900  if (unlikely(pg_mul_s32_overflow(val, 10, &val)) ||
5901  unlikely(pg_add_s32_overflow(val, digit, &val)))
5902  ereport(ERROR,
5903  (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
5904  errmsg("number is out of range")));
5905  ADVANCE_PARSE_POINTER(cp, end_ptr);
5906  found = true;
5907  }
5908 
5909  *ptr = cp;
5910  *value = val;
5911 
5912  return found;
5913 }
5914 
5915 /*
5916  * Parse a format specifier (generally following the SUS printf spec).
5917  *
5918  * We have already advanced over the initial '%', and we are looking for
5919  * [argpos][flags][width]type (but the type character is not consumed here).
5920  *
5921  * Inputs are start_ptr (the position after '%') and end_ptr (string end + 1).
5922  * Output parameters:
5923  * argpos: argument position for value to be printed. -1 means unspecified.
5924  * widthpos: argument position for width. Zero means the argument position
5925  * was unspecified (ie, take the next arg) and -1 means no width
5926  * argument (width was omitted or specified as a constant).
5927  * flags: bitmask of flags.
5928  * width: directly-specified width value. Zero means the width was omitted
5929  * (note it's not necessary to distinguish this case from an explicit
5930  * zero width value).
5931  *
5932  * The function result is the next character position to be parsed, ie, the
5933  * location where the type character is/should be.
5934  *
5935  * Note parsing invariant: at least one character is known available before
5936  * string end (end_ptr) at entry, and this is still true at exit.
5937  */
5938 static const char *
5939 text_format_parse_format(const char *start_ptr, const char *end_ptr,
5940  int *argpos, int *widthpos,
5941  int *flags, int *width)
5942 {
5943  const char *cp = start_ptr;
5944  int n;
5945 
5946  /* set defaults for output parameters */
5947  *argpos = -1;
5948  *widthpos = -1;
5949  *flags = 0;
5950  *width = 0;
5951 
5952  /* try to identify first number */
5953  if (text_format_parse_digits(&cp, end_ptr, &n))
5954  {
5955  if (*cp != '$')
5956  {
5957  /* Must be just a width and a type, so we're done */
5958  *width = n;
5959  return cp;
5960  }
5961  /* The number was argument position */
5962  *argpos = n;
5963  /* Explicit 0 for argument index is immediately refused */
5964  if (n == 0)
5965  ereport(ERROR,
5966  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5967  errmsg("format specifies argument 0, but arguments are numbered from 1")));
5968  ADVANCE_PARSE_POINTER(cp, end_ptr);
5969  }
5970 
5971  /* Handle flags (only minus is supported now) */
5972  while (*cp == '-')
5973  {
5974  *flags |= TEXT_FORMAT_FLAG_MINUS;
5975  ADVANCE_PARSE_POINTER(cp, end_ptr);
5976  }
5977 
5978  if (*cp == '*')
5979  {
5980  /* Handle indirect width */
5981  ADVANCE_PARSE_POINTER(cp, end_ptr);
5982  if (text_format_parse_digits(&cp, end_ptr, &n))
5983  {
5984  /* number in this position must be closed by $ */
5985  if (*cp != '$')
5986  ereport(ERROR,
5987  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5988  errmsg("width argument position must be ended by \"$\"")));
5989  /* The number was width argument position */
5990  *widthpos = n;
5991  /* Explicit 0 for argument index is immediately refused */
5992  if (n == 0)
5993  ereport(ERROR,
5994  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5995  errmsg("format specifies argument 0, but arguments are numbered from 1")));
5996  ADVANCE_PARSE_POINTER(cp, end_ptr);
5997  }
5998  else
5999  *widthpos = 0; /* width's argument position is unspecified */
6000  }
6001  else
6002  {
6003  /* Check for direct width specification */
6004  if (text_format_parse_digits(&cp, end_ptr, &n))
6005  *width = n;
6006  }
6007 
6008  /* cp should now be pointing at type character */
6009  return cp;
6010 }
6011 
6012 /*
6013  * Format a %s, %I, or %L conversion
6014  */
6015 static void
6017  FmgrInfo *typOutputInfo,
6018  Datum