PostgreSQL Source Code git master
Loading...
Searching...
No Matches
varchar.c File Reference
#include "postgres.h"
#include "access/detoast.h"
#include "access/htup_details.h"
#include "catalog/pg_collation.h"
#include "catalog/pg_type.h"
#include "common/hashfn.h"
#include "libpq/pqformat.h"
#include "mb/pg_wchar.h"
#include "nodes/nodeFuncs.h"
#include "nodes/supportnodes.h"
#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/pg_locale.h"
#include "utils/varlena.h"
Include dependency graph for varchar.c:

Go to the source code of this file.

Functions

static int32 anychar_typmodin (ArrayType *ta, const char *typename)
 
static charanychar_typmodout (int32 typmod)
 
static BpCharbpchar_input (const char *s, size_t len, int32 atttypmod, Node *escontext)
 
Datum bpcharin (PG_FUNCTION_ARGS)
 
Datum bpcharout (PG_FUNCTION_ARGS)
 
Datum bpcharrecv (PG_FUNCTION_ARGS)
 
Datum bpcharsend (PG_FUNCTION_ARGS)
 
Datum bpchar (PG_FUNCTION_ARGS)
 
Datum char_bpchar (PG_FUNCTION_ARGS)
 
Datum bpchar_name (PG_FUNCTION_ARGS)
 
Datum name_bpchar (PG_FUNCTION_ARGS)
 
Datum bpchartypmodin (PG_FUNCTION_ARGS)
 
Datum bpchartypmodout (PG_FUNCTION_ARGS)
 
static VarCharvarchar_input (const char *s, size_t len, int32 atttypmod, Node *escontext)
 
Datum varcharin (PG_FUNCTION_ARGS)
 
Datum varcharout (PG_FUNCTION_ARGS)
 
Datum varcharrecv (PG_FUNCTION_ARGS)
 
Datum varcharsend (PG_FUNCTION_ARGS)
 
Datum varchar_support (PG_FUNCTION_ARGS)
 
Datum varchar (PG_FUNCTION_ARGS)
 
Datum varchartypmodin (PG_FUNCTION_ARGS)
 
Datum varchartypmodout (PG_FUNCTION_ARGS)
 
static int bcTruelen (BpChar *arg)
 
int bpchartruelen (char *s, int len)
 
Datum bpcharlen (PG_FUNCTION_ARGS)
 
Datum bpcharoctetlen (PG_FUNCTION_ARGS)
 
static void check_collation_set (Oid collid)
 
Datum bpchareq (PG_FUNCTION_ARGS)
 
Datum bpcharne (PG_FUNCTION_ARGS)
 
Datum bpcharlt (PG_FUNCTION_ARGS)
 
Datum bpcharle (PG_FUNCTION_ARGS)
 
Datum bpchargt (PG_FUNCTION_ARGS)
 
Datum bpcharge (PG_FUNCTION_ARGS)
 
Datum bpcharcmp (PG_FUNCTION_ARGS)
 
Datum bpchar_sortsupport (PG_FUNCTION_ARGS)
 
Datum bpchar_larger (PG_FUNCTION_ARGS)
 
Datum bpchar_smaller (PG_FUNCTION_ARGS)
 
Datum hashbpchar (PG_FUNCTION_ARGS)
 
Datum hashbpcharextended (PG_FUNCTION_ARGS)
 
static int internal_bpchar_pattern_compare (BpChar *arg1, BpChar *arg2)
 
Datum bpchar_pattern_lt (PG_FUNCTION_ARGS)
 
Datum bpchar_pattern_le (PG_FUNCTION_ARGS)
 
Datum bpchar_pattern_ge (PG_FUNCTION_ARGS)
 
Datum bpchar_pattern_gt (PG_FUNCTION_ARGS)
 
Datum btbpchar_pattern_cmp (PG_FUNCTION_ARGS)
 
Datum btbpchar_pattern_sortsupport (PG_FUNCTION_ARGS)
 

Function Documentation

◆ anychar_typmodin()

static int32 anychar_typmodin ( ArrayType ta,
const char typename 
)
static

Definition at line 33 of file varchar.c.

34{
35 int32 typmod;
36 int32 *tl;
37 int n;
38
40
41 /*
42 * we're not too tense about good error message here because grammar
43 * shouldn't allow wrong number of modifiers for CHAR
44 */
45 if (n != 1)
48 errmsg("invalid type modifier")));
49
50 if (*tl < 1)
53 errmsg("length for type %s must be at least 1", typename)));
54 if (*tl > MaxAttrSize)
57 errmsg("length for type %s cannot exceed %d",
58 typename, MaxAttrSize)));
59
60 /*
61 * For largely historical reasons, the typmod is VARHDRSZ plus the number
62 * of characters; there is enough client-side code that knows about that
63 * that we'd better not change it.
64 */
65 typmod = VARHDRSZ + *tl;
66
67 return typmod;
68}
int32 * ArrayGetIntegerTypmods(ArrayType *arr, int *n)
Definition arrayutils.c:233
#define VARHDRSZ
Definition c.h:781
int32_t int32
Definition c.h:620
int errcode(int sqlerrcode)
Definition elog.c:875
#define ERROR
Definition elog.h:40
#define ereport(elevel,...)
Definition elog.h:152
#define MaxAttrSize
static char * errmsg
static int fb(int x)

References ArrayGetIntegerTypmods(), ereport, errcode(), errmsg, ERROR, fb(), MaxAttrSize, and VARHDRSZ.

Referenced by bpchartypmodin(), and varchartypmodin().

◆ anychar_typmodout()

static char * anychar_typmodout ( int32  typmod)
static

Definition at line 72 of file varchar.c.

73{
74 char *res = (char *) palloc(64);
75
76 if (typmod > VARHDRSZ)
77 snprintf(res, 64, "(%d)", (int) (typmod - VARHDRSZ));
78 else
79 *res = '\0';
80
81 return res;
82}
void * palloc(Size size)
Definition mcxt.c:1390
#define snprintf
Definition port.h:261

References palloc(), snprintf, and VARHDRSZ.

Referenced by bpchartypmodout(), and varchartypmodout().

◆ bcTruelen()

static int bcTruelen ( BpChar arg)
inlinestatic

Definition at line 673 of file varchar.c.

674{
676}
Datum arg
Definition elog.c:1323
static Size VARSIZE_ANY_EXHDR(const void *PTR)
Definition varatt.h:472
static char * VARDATA_ANY(const void *PTR)
Definition varatt.h:486
int bpchartruelen(char *s, int len)
Definition varchar.c:679

References arg, bpchartruelen(), VARDATA_ANY(), and VARSIZE_ANY_EXHDR().

Referenced by bpchar_larger(), bpchar_smaller(), bpcharcmp(), bpchareq(), bpcharge(), bpchargt(), bpcharle(), bpcharlen(), bpcharlt(), bpcharne(), hashbpchar(), hashbpcharextended(), and internal_bpchar_pattern_compare().

◆ bpchar()

Datum bpchar ( PG_FUNCTION_ARGS  )

Definition at line 271 of file varchar.c.

272{
274 int32 maxlen = PG_GETARG_INT32(1);
275 bool isExplicit = PG_GETARG_BOOL(2);
276 BpChar *result;
277 int32 len;
278 char *r;
279 char *s;
280 int i;
281 int charlen; /* number of characters in the input string +
282 * VARHDRSZ */
283
284 /* No work if typmod is invalid */
285 if (maxlen < (int32) VARHDRSZ)
287
288 maxlen -= VARHDRSZ;
289
291 s = VARDATA_ANY(source);
292
293 charlen = pg_mbstrlen_with_len(s, len);
294
295 /* No work if supplied data matches typmod already */
296 if (charlen == maxlen)
298
299 if (charlen > maxlen)
300 {
301 /* Verify that extra characters are spaces, and clip them off */
302 size_t maxmblen;
303
304 maxmblen = pg_mbcharcliplen(s, len, maxlen);
305
306 if (!isExplicit)
307 {
308 for (i = maxmblen; i < len; i++)
309 if (s[i] != ' ')
310 ereturn(fcinfo->context, (Datum) 0,
312 errmsg("value too long for type character(%d)",
313 maxlen)));
314 }
315
316 len = maxmblen;
317
318 /*
319 * At this point, maxlen is the necessary byte length, not the number
320 * of CHARACTERS!
321 */
322 maxlen = len;
323 }
324 else
325 {
326 /*
327 * At this point, maxlen is the necessary byte length, not the number
328 * of CHARACTERS!
329 */
330 maxlen = len + (maxlen - charlen);
331 }
332
333 Assert(maxlen >= len);
334
335 result = palloc(maxlen + VARHDRSZ);
336 SET_VARSIZE(result, maxlen + VARHDRSZ);
337 r = VARDATA(result);
338
339 memcpy(r, s, len);
340
341 /* blank pad the string if necessary */
342 if (maxlen > len)
343 memset(r + len, ' ', maxlen - len);
344
346}
#define Assert(condition)
Definition c.h:943
uint32 result
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
#define ereturn(context, dummy_value,...)
Definition elog.h:280
#define PG_GETARG_BPCHAR_PP(n)
Definition fmgr.h:311
#define PG_RETURN_BPCHAR_P(x)
Definition fmgr.h:375
#define PG_GETARG_INT32(n)
Definition fmgr.h:269
#define PG_GETARG_BOOL(n)
Definition fmgr.h:274
int i
Definition isn.c:77
int pg_mbstrlen_with_len(const char *mbstr, int limit)
Definition mbutils.c:1186
int pg_mbcharcliplen(const char *mbstr, int len, int limit)
Definition mbutils.c:1254
const void size_t len
static rewind_source * source
Definition pg_rewind.c:89
uint64_t Datum
Definition postgres.h:70
Definition c.h:776
static char * VARDATA(const void *PTR)
Definition varatt.h:305
static void SET_VARSIZE(void *PTR, Size len)
Definition varatt.h:432

References Assert, ereturn, errcode(), errmsg, fb(), i, len, memcpy(), palloc(), PG_GETARG_BOOL, PG_GETARG_BPCHAR_PP, PG_GETARG_INT32, pg_mbcharcliplen(), pg_mbstrlen_with_len(), PG_RETURN_BPCHAR_P, result, SET_VARSIZE(), source, VARDATA(), VARDATA_ANY(), VARHDRSZ, and VARSIZE_ANY_EXHDR().

◆ bpchar_input()

static BpChar * bpchar_input ( const char s,
size_t  len,
int32  atttypmod,
Node escontext 
)
static

Definition at line 130 of file varchar.c.

131{
132 BpChar *result;
133 char *r;
134 size_t maxlen;
135
136 /* If typmod is -1 (or invalid), use the actual string length */
137 if (atttypmod < (int32) VARHDRSZ)
138 maxlen = len;
139 else
140 {
141 size_t charlen; /* number of CHARACTERS in the input */
142
143 maxlen = atttypmod - VARHDRSZ;
144 charlen = pg_mbstrlen_with_len(s, len);
145 if (charlen > maxlen)
146 {
147 /* Verify that extra characters are spaces, and clip them off */
148 size_t mbmaxlen = pg_mbcharcliplen(s, len, maxlen);
149 size_t j;
150
151 /*
152 * at this point, len is the actual BYTE length of the input
153 * string, maxlen is the max number of CHARACTERS allowed for this
154 * bpchar type, mbmaxlen is the length in BYTES of those chars.
155 */
156 for (j = mbmaxlen; j < len; j++)
157 {
158 if (s[j] != ' ')
159 ereturn(escontext, NULL,
161 errmsg("value too long for type character(%zu)",
162 maxlen)));
163 }
164
165 /*
166 * Now we set maxlen to the necessary byte length, not the number
167 * of CHARACTERS!
168 */
169 maxlen = len = mbmaxlen;
170 }
171 else
172 {
173 /*
174 * Now we set maxlen to the necessary byte length, not the number
175 * of CHARACTERS!
176 */
177 maxlen = len + (maxlen - charlen);
178 }
179 }
180
181 result = (BpChar *) palloc(maxlen + VARHDRSZ);
182 SET_VARSIZE(result, maxlen + VARHDRSZ);
183 r = VARDATA(result);
184 memcpy(r, s, len);
185
186 /* blank pad the string if necessary */
187 if (maxlen > len)
188 memset(r + len, ' ', maxlen - len);
189
190 return result;
191}
int j
Definition isn.c:78

References ereturn, errcode(), errmsg, fb(), j, len, memcpy(), palloc(), pg_mbcharcliplen(), pg_mbstrlen_with_len(), result, SET_VARSIZE(), VARDATA(), and VARHDRSZ.

Referenced by bpcharin(), and bpcharrecv().

◆ bpchar_larger()

Datum bpchar_larger ( PG_FUNCTION_ARGS  )

Definition at line 950 of file varchar.c.

951{
954 int len1,
955 len2;
956 int cmp;
957
958 len1 = bcTruelen(arg1);
959 len2 = bcTruelen(arg2);
960
963
964 PG_RETURN_BPCHAR_P((cmp >= 0) ? arg1 : arg2);
965}
#define PG_GET_COLLATION()
Definition fmgr.h:198
static int cmp(const chr *x, const chr *y, size_t len)
static int bcTruelen(BpChar *arg)
Definition varchar.c:673
int varstr_cmp(const char *arg1, int len1, const char *arg2, int len2, Oid collid)
Definition varlena.c:1355

References bcTruelen(), cmp(), fb(), PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, PG_RETURN_BPCHAR_P, VARDATA_ANY(), and varstr_cmp().

◆ bpchar_name()

Datum bpchar_name ( PG_FUNCTION_ARGS  )

Definition at line 373 of file varchar.c.

374{
376 char *s_data;
377 Name result;
378 int len;
379
381 s_data = VARDATA_ANY(s);
382
383 /* Truncate oversize input */
384 if (len >= NAMEDATALEN)
386
387 /* Remove trailing blanks */
388 while (len > 0)
389 {
390 if (s_data[len - 1] != ' ')
391 break;
392 len--;
393 }
394
395 /* We use palloc0 here to ensure result is zero-padded */
398
400}
#define NameStr(name)
Definition c.h:835
NameData * Name
Definition c.h:833
#define PG_RETURN_NAME(x)
Definition fmgr.h:365
int pg_mbcliplen(const char *mbstr, int len, int limit)
Definition mbutils.c:1212
void * palloc0(Size size)
Definition mcxt.c:1420
#define NAMEDATALEN
Definition c.h:830

References fb(), len, memcpy(), NAMEDATALEN, NameStr, palloc0(), PG_GETARG_BPCHAR_PP, pg_mbcliplen(), PG_RETURN_NAME, result, VARDATA_ANY(), and VARSIZE_ANY_EXHDR().

◆ bpchar_pattern_ge()

Datum bpchar_pattern_ge ( PG_FUNCTION_ARGS  )

Definition at line 1166 of file varchar.c.

1167{
1170 int result;
1171
1173
1176
1177 PG_RETURN_BOOL(result >= 0);
1178}
#define PG_FREE_IF_COPY(ptr, n)
Definition fmgr.h:260
#define PG_RETURN_BOOL(x)
Definition fmgr.h:360
static int internal_bpchar_pattern_compare(BpChar *arg1, BpChar *arg2)
Definition varchar.c:1112

References fb(), internal_bpchar_pattern_compare(), PG_FREE_IF_COPY, PG_GETARG_BPCHAR_PP, PG_RETURN_BOOL, and result.

◆ bpchar_pattern_gt()

Datum bpchar_pattern_gt ( PG_FUNCTION_ARGS  )

◆ bpchar_pattern_le()

Datum bpchar_pattern_le ( PG_FUNCTION_ARGS  )

◆ bpchar_pattern_lt()

Datum bpchar_pattern_lt ( PG_FUNCTION_ARGS  )

◆ bpchar_smaller()

Datum bpchar_smaller ( PG_FUNCTION_ARGS  )

Definition at line 968 of file varchar.c.

969{
972 int len1,
973 len2;
974 int cmp;
975
976 len1 = bcTruelen(arg1);
977 len2 = bcTruelen(arg2);
978
981
982 PG_RETURN_BPCHAR_P((cmp <= 0) ? arg1 : arg2);
983}

References bcTruelen(), cmp(), fb(), PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, PG_RETURN_BPCHAR_P, VARDATA_ANY(), and varstr_cmp().

◆ bpchar_sortsupport()

Datum bpchar_sortsupport ( PG_FUNCTION_ARGS  )

Definition at line 933 of file varchar.c.

934{
936 Oid collid = ssup->ssup_collation;
937 MemoryContext oldcontext;
938
939 oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
940
941 /* Use generic string SortSupport */
943
944 MemoryContextSwitchTo(oldcontext);
945
947}
Oid collid
struct SortSupportData * SortSupport
Definition execnodes.h:61
#define PG_RETURN_VOID()
Definition fmgr.h:350
#define PG_GETARG_POINTER(n)
Definition fmgr.h:277
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition palloc.h:138
unsigned int Oid
MemoryContext ssup_cxt
Definition sortsupport.h:66
void varstr_sortsupport(SortSupport ssup, Oid typid, Oid collid)
Definition varlena.c:1672

References collid, fb(), MemoryContextSwitchTo(), PG_GETARG_POINTER, PG_RETURN_VOID, SortSupportData::ssup_collation, SortSupportData::ssup_cxt, and varstr_sortsupport().

◆ bpcharcmp()

Datum bpcharcmp ( PG_FUNCTION_ARGS  )

Definition at line 912 of file varchar.c.

913{
916 int len1,
917 len2;
918 int cmp;
919
920 len1 = bcTruelen(arg1);
921 len2 = bcTruelen(arg2);
922
925
928
930}
#define PG_RETURN_INT32(x)
Definition fmgr.h:355

References bcTruelen(), cmp(), fb(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, PG_RETURN_INT32, VARDATA_ANY(), and varstr_cmp().

Referenced by gbt_bpchar_ssup_cmp(), and gbt_bpcharcmp().

◆ bpchareq()

Datum bpchareq ( PG_FUNCTION_ARGS  )

Definition at line 746 of file varchar.c.

747{
750 int len1,
751 len2;
752 bool result;
755
757
758 len1 = bcTruelen(arg1);
759 len2 = bcTruelen(arg2);
760
762
763 if (mylocale->deterministic)
764 {
765 /*
766 * Since we only care about equality or not-equality, we can avoid all
767 * the expense of strcoll() here, and just do bitwise comparison.
768 */
769 if (len1 != len2)
770 result = false;
771 else
772 result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) == 0);
773 }
774 else
775 {
777 collid) == 0);
778 }
779
782
784}
pg_locale_t pg_newlocale_from_collation(Oid collid)
Definition pg_locale.c:1189
static void check_collation_set(Oid collid)
Definition varchar.c:730

References bcTruelen(), check_collation_set(), collid, fb(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, pg_newlocale_from_collation(), PG_RETURN_BOOL, result, VARDATA_ANY(), and varstr_cmp().

Referenced by gbt_bpchareq().

◆ bpcharge()

Datum bpcharge ( PG_FUNCTION_ARGS  )

Definition at line 891 of file varchar.c.

892{
895 int len1,
896 len2;
897 int cmp;
898
899 len1 = bcTruelen(arg1);
900 len2 = bcTruelen(arg2);
901
904
907
908 PG_RETURN_BOOL(cmp >= 0);
909}

References bcTruelen(), cmp(), fb(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, PG_RETURN_BOOL, VARDATA_ANY(), and varstr_cmp().

Referenced by gbt_bpcharge().

◆ bpchargt()

Datum bpchargt ( PG_FUNCTION_ARGS  )

Definition at line 870 of file varchar.c.

871{
874 int len1,
875 len2;
876 int cmp;
877
878 len1 = bcTruelen(arg1);
879 len2 = bcTruelen(arg2);
880
883
886
887 PG_RETURN_BOOL(cmp > 0);
888}

References bcTruelen(), cmp(), fb(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, PG_RETURN_BOOL, VARDATA_ANY(), and varstr_cmp().

Referenced by gbt_bpchargt().

◆ bpcharin()

Datum bpcharin ( PG_FUNCTION_ARGS  )

Definition at line 198 of file varchar.c.

199{
200 char *s = PG_GETARG_CSTRING(0);
201#ifdef NOT_USED
202 Oid typelem = PG_GETARG_OID(1);
203#endif
204 int32 atttypmod = PG_GETARG_INT32(2);
205 BpChar *result;
206
207 result = bpchar_input(s, strlen(s), atttypmod, fcinfo->context);
209}
#define PG_GETARG_OID(n)
Definition fmgr.h:275
#define PG_GETARG_CSTRING(n)
Definition fmgr.h:278
static BpChar * bpchar_input(const char *s, size_t len, int32 atttypmod, Node *escontext)
Definition varchar.c:130

References bpchar_input(), fb(), PG_GETARG_CSTRING, PG_GETARG_INT32, PG_GETARG_OID, PG_RETURN_BPCHAR_P, and result.

◆ bpcharle()

Datum bpcharle ( PG_FUNCTION_ARGS  )

Definition at line 849 of file varchar.c.

850{
853 int len1,
854 len2;
855 int cmp;
856
857 len1 = bcTruelen(arg1);
858 len2 = bcTruelen(arg2);
859
862
865
866 PG_RETURN_BOOL(cmp <= 0);
867}

References bcTruelen(), cmp(), fb(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, PG_RETURN_BOOL, VARDATA_ANY(), and varstr_cmp().

Referenced by gbt_bpcharle().

◆ bpcharlen()

Datum bpcharlen ( PG_FUNCTION_ARGS  )

Definition at line 696 of file varchar.c.

697{
699 int len;
700
701 /* get number of bytes, ignoring trailing spaces */
702 len = bcTruelen(arg);
703
704 /* in multibyte encoding, convert to number of characters */
707
709}
int pg_database_encoding_max_length(void)
Definition mbutils.c:1673

References arg, bcTruelen(), len, pg_database_encoding_max_length(), PG_GETARG_BPCHAR_PP, pg_mbstrlen_with_len(), PG_RETURN_INT32, and VARDATA_ANY().

◆ bpcharlt()

Datum bpcharlt ( PG_FUNCTION_ARGS  )

Definition at line 828 of file varchar.c.

829{
832 int len1,
833 len2;
834 int cmp;
835
836 len1 = bcTruelen(arg1);
837 len2 = bcTruelen(arg2);
838
841
844
845 PG_RETURN_BOOL(cmp < 0);
846}

References bcTruelen(), cmp(), fb(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, PG_RETURN_BOOL, VARDATA_ANY(), and varstr_cmp().

Referenced by gbt_bpcharlt().

◆ bpcharne()

Datum bpcharne ( PG_FUNCTION_ARGS  )

Definition at line 787 of file varchar.c.

788{
791 int len1,
792 len2;
793 bool result;
796
798
799 len1 = bcTruelen(arg1);
800 len2 = bcTruelen(arg2);
801
803
804 if (mylocale->deterministic)
805 {
806 /*
807 * Since we only care about equality or not-equality, we can avoid all
808 * the expense of strcoll() here, and just do bitwise comparison.
809 */
810 if (len1 != len2)
811 result = true;
812 else
813 result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) != 0);
814 }
815 else
816 {
818 collid) != 0);
819 }
820
823
825}

References bcTruelen(), check_collation_set(), collid, fb(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, pg_newlocale_from_collation(), PG_RETURN_BOOL, result, VARDATA_ANY(), and varstr_cmp().

◆ bpcharoctetlen()

Datum bpcharoctetlen ( PG_FUNCTION_ARGS  )

Definition at line 712 of file varchar.c.

713{
715
716 /* We need not detoast the input at all */
718}
Size toast_raw_datum_size(Datum value)
Definition detoast.c:545
#define PG_GETARG_DATUM(n)
Definition fmgr.h:268

References arg, PG_GETARG_DATUM, PG_RETURN_INT32, toast_raw_datum_size(), and VARHDRSZ.

◆ bpcharout()

Datum bpcharout ( PG_FUNCTION_ARGS  )

Definition at line 219 of file varchar.c.

220{
222
224}
#define TextDatumGetCString(d)
Definition builtins.h:99
#define PG_RETURN_CSTRING(x)
Definition fmgr.h:364

References fb(), PG_GETARG_DATUM, PG_RETURN_CSTRING, and TextDatumGetCString.

◆ bpcharrecv()

Datum bpcharrecv ( PG_FUNCTION_ARGS  )

Definition at line 230 of file varchar.c.

231{
233#ifdef NOT_USED
234 Oid typelem = PG_GETARG_OID(1);
235#endif
236 int32 atttypmod = PG_GETARG_INT32(2);
237 BpChar *result;
238 char *str;
239 int nbytes;
240
241 str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
242 result = bpchar_input(str, nbytes, atttypmod, NULL);
243 pfree(str);
245}
const char * str
void pfree(void *pointer)
Definition mcxt.c:1619
static char buf[DEFAULT_XLOG_SEG_SIZE]
char * pq_getmsgtext(StringInfo msg, int rawbytes, int *nbytes)
Definition pqformat.c:545
struct StringInfoData * StringInfo
Definition string.h:15

References bpchar_input(), buf, fb(), pfree(), PG_GETARG_INT32, PG_GETARG_OID, PG_GETARG_POINTER, PG_RETURN_BPCHAR_P, pq_getmsgtext(), result, and str.

◆ bpcharsend()

Datum bpcharsend ( PG_FUNCTION_ARGS  )

Definition at line 251 of file varchar.c.

252{
253 /* Exactly the same as textsend, so share code */
254 return textsend(fcinfo);
255}
Datum textsend(PG_FUNCTION_ARGS)
Definition varlena.c:318

References textsend().

◆ bpchartruelen()

int bpchartruelen ( char s,
int  len 
)

Definition at line 679 of file varchar.c.

680{
681 int i;
682
683 /*
684 * Note that we rely on the assumption that ' ' is a singleton unit on
685 * every supported multibyte server encoding.
686 */
687 for (i = len - 1; i >= 0; i--)
688 {
689 if (s[i] != ' ')
690 break;
691 }
692 return i + 1;
693}

References i, and len.

Referenced by bcTruelen(), bpcharfastcmp_c(), varstr_abbrev_convert(), and varstrfastcmp_locale().

◆ bpchartypmodin()

Datum bpchartypmodin ( PG_FUNCTION_ARGS  )

Definition at line 420 of file varchar.c.

421{
423
425}
#define PG_GETARG_ARRAYTYPE_P(n)
Definition array.h:263
static int32 anychar_typmodin(ArrayType *ta, const char *typename)
Definition varchar.c:33

References anychar_typmodin(), fb(), PG_GETARG_ARRAYTYPE_P, and PG_RETURN_INT32.

◆ bpchartypmodout()

Datum bpchartypmodout ( PG_FUNCTION_ARGS  )

Definition at line 428 of file varchar.c.

429{
430 int32 typmod = PG_GETARG_INT32(0);
431
433}
static char * anychar_typmodout(int32 typmod)
Definition varchar.c:72

References anychar_typmodout(), PG_GETARG_INT32, and PG_RETURN_CSTRING.

◆ btbpchar_pattern_cmp()

Datum btbpchar_pattern_cmp ( PG_FUNCTION_ARGS  )

◆ btbpchar_pattern_sortsupport()

Datum btbpchar_pattern_sortsupport ( PG_FUNCTION_ARGS  )

Definition at line 1214 of file varchar.c.

1215{
1217 MemoryContext oldcontext;
1218
1219 oldcontext = MemoryContextSwitchTo(ssup->ssup_cxt);
1220
1221 /* Use generic string SortSupport, forcing "C" collation */
1223
1224 MemoryContextSwitchTo(oldcontext);
1225
1227}

References fb(), MemoryContextSwitchTo(), PG_GETARG_POINTER, PG_RETURN_VOID, SortSupportData::ssup_cxt, and varstr_sortsupport().

◆ char_bpchar()

Datum char_bpchar ( PG_FUNCTION_ARGS  )

Definition at line 354 of file varchar.c.

355{
356 char c = PG_GETARG_CHAR(0);
357 BpChar *result;
358
359 result = (BpChar *) palloc(VARHDRSZ + 1);
360
362 *(VARDATA(result)) = c;
363
365}
#define PG_GETARG_CHAR(n)
Definition fmgr.h:273
char * c

References palloc(), PG_GETARG_CHAR, PG_RETURN_BPCHAR_P, result, SET_VARSIZE(), VARDATA(), and VARHDRSZ.

◆ check_collation_set()

static void check_collation_set ( Oid  collid)
static

Definition at line 730 of file varchar.c.

731{
732 if (!OidIsValid(collid))
733 {
734 /*
735 * This typically means that the parser could not resolve a conflict
736 * of implicit collations, so report it that way.
737 */
740 errmsg("could not determine which collation to use for string comparison"),
741 errhint("Use the COLLATE clause to set the collation explicitly.")));
742 }
743}
#define OidIsValid(objectId)
Definition c.h:858
int errhint(const char *fmt,...) pg_attribute_printf(1

References collid, ereport, errcode(), errhint(), errmsg, ERROR, fb(), and OidIsValid.

Referenced by bpchareq(), and bpcharne().

◆ hashbpchar()

Datum hashbpchar ( PG_FUNCTION_ARGS  )

Definition at line 991 of file varchar.c.

992{
995 char *keydata;
996 int keylen;
999
1000 if (!collid)
1001 ereport(ERROR,
1003 errmsg("could not determine which collation to use for string hashing"),
1004 errhint("Use the COLLATE clause to set the collation explicitly.")));
1005
1006 keydata = VARDATA_ANY(key);
1007 keylen = bcTruelen(key);
1008
1010
1011 if (mylocale->deterministic)
1012 {
1013 result = hash_any((unsigned char *) keydata, keylen);
1014 }
1015 else
1016 {
1017 Size bsize,
1018 rsize;
1019 char *buf;
1020
1021 bsize = pg_strnxfrm(NULL, 0, keydata, keylen, mylocale);
1022 buf = palloc(bsize + 1);
1023
1024 rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale);
1025
1026 /* the second call may return a smaller value than the first */
1027 if (rsize > bsize)
1028 elog(ERROR, "pg_strnxfrm() returned unexpected result");
1029
1030 /*
1031 * In principle, there's no reason to include the terminating NUL
1032 * character in the hash, but it was done before and the behavior must
1033 * be preserved.
1034 */
1035 result = hash_any((uint8_t *) buf, bsize + 1);
1036
1037 pfree(buf);
1038 }
1039
1040 /* Avoid leaking memory for toasted inputs */
1041 PG_FREE_IF_COPY(key, 0);
1042
1043 return result;
1044}
size_t Size
Definition c.h:689
#define elog(elevel,...)
Definition elog.h:228
static Datum hash_any(const unsigned char *k, int keylen)
Definition hashfn.h:31
size_t pg_strnxfrm(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale)
Definition pg_locale.c:1454

References bcTruelen(), buf, collid, elog, ereport, errcode(), errhint(), errmsg, ERROR, fb(), hash_any(), palloc(), pfree(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, pg_newlocale_from_collation(), pg_strnxfrm(), result, and VARDATA_ANY().

◆ hashbpcharextended()

Datum hashbpcharextended ( PG_FUNCTION_ARGS  )

Definition at line 1047 of file varchar.c.

1048{
1051 char *keydata;
1052 int keylen;
1054 Datum result;
1055
1056 if (!collid)
1057 ereport(ERROR,
1059 errmsg("could not determine which collation to use for string hashing"),
1060 errhint("Use the COLLATE clause to set the collation explicitly.")));
1061
1062 keydata = VARDATA_ANY(key);
1063 keylen = bcTruelen(key);
1064
1066
1067 if (mylocale->deterministic)
1068 {
1069 result = hash_any_extended((unsigned char *) keydata, keylen,
1070 PG_GETARG_INT64(1));
1071 }
1072 else
1073 {
1074 Size bsize,
1075 rsize;
1076 char *buf;
1077
1078 bsize = pg_strnxfrm(NULL, 0, keydata, keylen, mylocale);
1079 buf = palloc(bsize + 1);
1080
1081 rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale);
1082
1083 /* the second call may return a smaller value than the first */
1084 if (rsize > bsize)
1085 elog(ERROR, "pg_strnxfrm() returned unexpected result");
1086
1087 /*
1088 * In principle, there's no reason to include the terminating NUL
1089 * character in the hash, but it was done before and the behavior must
1090 * be preserved.
1091 */
1093 PG_GETARG_INT64(1));
1094
1095 pfree(buf);
1096 }
1097
1098 PG_FREE_IF_COPY(key, 0);
1099
1100 return result;
1101}
#define PG_GETARG_INT64(n)
Definition fmgr.h:284
static Datum hash_any_extended(const unsigned char *k, int keylen, uint64 seed)
Definition hashfn.h:37

References bcTruelen(), buf, collid, elog, ereport, errcode(), errhint(), errmsg, ERROR, fb(), hash_any_extended(), palloc(), pfree(), PG_FREE_IF_COPY, PG_GET_COLLATION, PG_GETARG_BPCHAR_PP, PG_GETARG_INT64, pg_newlocale_from_collation(), pg_strnxfrm(), result, and VARDATA_ANY().

◆ internal_bpchar_pattern_compare()

static int internal_bpchar_pattern_compare ( BpChar arg1,
BpChar arg2 
)
static

Definition at line 1112 of file varchar.c.

1113{
1114 int result;
1115 int len1,
1116 len2;
1117
1118 len1 = bcTruelen(arg1);
1119 len2 = bcTruelen(arg2);
1120
1121 result = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
1122 if (result != 0)
1123 return result;
1124 else if (len1 < len2)
1125 return -1;
1126 else if (len1 > len2)
1127 return 1;
1128 else
1129 return 0;
1130}
#define Min(x, y)
Definition c.h:1091

References bcTruelen(), fb(), Min, result, and VARDATA_ANY().

Referenced by bpchar_pattern_ge(), bpchar_pattern_gt(), bpchar_pattern_le(), bpchar_pattern_lt(), and btbpchar_pattern_cmp().

◆ name_bpchar()

Datum name_bpchar ( PG_FUNCTION_ARGS  )

Definition at line 410 of file varchar.c.

411{
412 Name s = PG_GETARG_NAME(0);
413 BpChar *result;
414
417}
#define PG_GETARG_NAME(n)
Definition fmgr.h:279
text * cstring_to_text(const char *s)
Definition varlena.c:184

References cstring_to_text(), NameStr, PG_GETARG_NAME, PG_RETURN_BPCHAR_P, and result.

◆ varchar()

Datum varchar ( PG_FUNCTION_ARGS  )

Definition at line 612 of file varchar.c.

613{
615 int32 typmod = PG_GETARG_INT32(1);
616 bool isExplicit = PG_GETARG_BOOL(2);
617 int32 len,
618 maxlen;
619 size_t maxmblen;
620 int i;
621 char *s_data;
622
625 maxlen = typmod - VARHDRSZ;
626
627 /* No work if typmod is invalid or supplied data fits it already */
628 if (maxlen < 0 || len <= maxlen)
630
631 /* only reach here if string is too long... */
632
633 /* truncate multibyte string preserving multibyte boundary */
634 maxmblen = pg_mbcharcliplen(s_data, len, maxlen);
635
636 if (!isExplicit)
637 {
638 for (i = maxmblen; i < len; i++)
639 if (s_data[i] != ' ')
640 ereturn(fcinfo->context, (Datum) 0,
642 errmsg("value too long for type character varying(%d)",
643 maxlen)));
644 }
645
647 maxmblen));
648}
#define PG_GETARG_VARCHAR_PP(n)
Definition fmgr.h:312
#define PG_RETURN_VARCHAR_P(x)
Definition fmgr.h:376
text * cstring_to_text_with_len(const char *s, int len)
Definition varlena.c:196

References cstring_to_text_with_len(), ereturn, errcode(), errmsg, fb(), i, len, PG_GETARG_BOOL, PG_GETARG_INT32, PG_GETARG_VARCHAR_PP, pg_mbcharcliplen(), PG_RETURN_VARCHAR_P, source, VARDATA_ANY(), VARHDRSZ, and VARSIZE_ANY_EXHDR().

Referenced by main().

◆ varchar_input()

static VarChar * varchar_input ( const char s,
size_t  len,
int32  atttypmod,
Node escontext 
)
static

Definition at line 460 of file varchar.c.

461{
463 size_t maxlen;
464
465 maxlen = atttypmod - VARHDRSZ;
466
467 if (atttypmod >= (int32) VARHDRSZ && len > maxlen)
468 {
469 /* Verify that extra characters are spaces, and clip them off */
470 size_t mbmaxlen = pg_mbcharcliplen(s, len, maxlen);
471 size_t j;
472
473 for (j = mbmaxlen; j < len; j++)
474 {
475 if (s[j] != ' ')
476 ereturn(escontext, NULL,
478 errmsg("value too long for type character varying(%zu)",
479 maxlen)));
480 }
481
482 len = mbmaxlen;
483 }
484
485 /*
486 * We can use cstring_to_text_with_len because VarChar and text are
487 * binary-compatible types.
488 */
490 return result;
491}

References cstring_to_text_with_len(), ereturn, errcode(), errmsg, fb(), j, len, pg_mbcharcliplen(), result, and VARHDRSZ.

Referenced by varcharin(), and varcharrecv().

◆ varchar_support()

Datum varchar_support ( PG_FUNCTION_ARGS  )

Definition at line 568 of file varchar.c.

569{
571 Node *ret = NULL;
572
574 {
576 FuncExpr *expr = req->fcall;
577 Node *typmod;
578
579 Assert(list_length(expr->args) >= 2);
580
581 typmod = (Node *) lsecond(expr->args);
582
583 if (IsA(typmod, Const) && !((Const *) typmod)->constisnull)
584 {
585 Node *source = (Node *) linitial(expr->args);
590
591 if (new_typmod < 0 || (old_typmod >= 0 && old_max <= new_max))
593 }
594 }
595
597}
#define PG_RETURN_POINTER(x)
Definition fmgr.h:363
int32 exprTypmod(const Node *expr)
Definition nodeFuncs.c:304
Node * relabel_to_typmod(Node *expr, int32 typmod)
Definition nodeFuncs.c:694
#define IsA(nodeptr, _type_)
Definition nodes.h:164
static int list_length(const List *l)
Definition pg_list.h:152
#define linitial(l)
Definition pg_list.h:178
#define lsecond(l)
Definition pg_list.h:183
static int32 DatumGetInt32(Datum X)
Definition postgres.h:202
List * args
Definition primnodes.h:801
Definition nodes.h:135

References FuncExpr::args, Assert, DatumGetInt32(), exprTypmod(), fb(), IsA, linitial, list_length(), lsecond, PG_GETARG_POINTER, PG_RETURN_POINTER, relabel_to_typmod(), source, and VARHDRSZ.

◆ varcharin()

Datum varcharin ( PG_FUNCTION_ARGS  )

Definition at line 498 of file varchar.c.

499{
500 char *s = PG_GETARG_CSTRING(0);
501#ifdef NOT_USED
502 Oid typelem = PG_GETARG_OID(1);
503#endif
504 int32 atttypmod = PG_GETARG_INT32(2);
506
507 result = varchar_input(s, strlen(s), atttypmod, fcinfo->context);
509}
static VarChar * varchar_input(const char *s, size_t len, int32 atttypmod, Node *escontext)
Definition varchar.c:460

References fb(), PG_GETARG_CSTRING, PG_GETARG_INT32, PG_GETARG_OID, PG_RETURN_VARCHAR_P, result, and varchar_input().

◆ varcharout()

Datum varcharout ( PG_FUNCTION_ARGS  )

Definition at line 519 of file varchar.c.

References fb(), PG_GETARG_DATUM, PG_RETURN_CSTRING, and TextDatumGetCString.

◆ varcharrecv()

Datum varcharrecv ( PG_FUNCTION_ARGS  )

Definition at line 530 of file varchar.c.

531{
533#ifdef NOT_USED
534 Oid typelem = PG_GETARG_OID(1);
535#endif
536 int32 atttypmod = PG_GETARG_INT32(2);
538 char *str;
539 int nbytes;
540
541 str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
542 result = varchar_input(str, nbytes, atttypmod, NULL);
543 pfree(str);
545}

References buf, fb(), pfree(), PG_GETARG_INT32, PG_GETARG_OID, PG_GETARG_POINTER, PG_RETURN_VARCHAR_P, pq_getmsgtext(), result, str, and varchar_input().

◆ varcharsend()

Datum varcharsend ( PG_FUNCTION_ARGS  )

Definition at line 551 of file varchar.c.

552{
553 /* Exactly the same as textsend, so share code */
554 return textsend(fcinfo);
555}

References textsend().

◆ varchartypmodin()

Datum varchartypmodin ( PG_FUNCTION_ARGS  )

Definition at line 651 of file varchar.c.

652{
654
656}

References anychar_typmodin(), fb(), PG_GETARG_ARRAYTYPE_P, and PG_RETURN_INT32.

◆ varchartypmodout()

Datum varchartypmodout ( PG_FUNCTION_ARGS  )

Definition at line 659 of file varchar.c.

660{
661 int32 typmod = PG_GETARG_INT32(0);
662
664}

References anychar_typmodout(), PG_GETARG_INT32, and PG_RETURN_CSTRING.