PostgreSQL Source Code: src/backend/utils/adt/varchar.c Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

16

30

31

34{

37 int n;

38

40

41

42

43

44

45 if (n != 1)

47 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),

48 errmsg("invalid type modifier")));

49

50 if (*tl < 1)

52 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),

53 errmsg("length for type %s must be at least 1", typename)));

56 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),

57 errmsg("length for type %s cannot exceed %d",

59

60

61

62

63

64

66

67 return typmod;

68}

69

70

71static char *

73{

74 char *res = (char *) palloc(64);

75

78 else

79 *res = '\0';

80

81 return res;

82}

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

131{

133 char *r;

134 size_t maxlen;

135

136

138 maxlen = len;

139 else

140 {

141 size_t charlen;

142

143 maxlen = atttypmod - VARHDRSZ;

145 if (charlen > maxlen)

146 {

147

149 size_t j;

150

151

152

153

154

155

156 for (j = mbmaxlen; j < len; j++)

157 {

158 if (s[j] != ' ')

160 (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),

161 errmsg("value too long for type character(%d)",

162 (int) maxlen)));

163 }

164

165

166

167

168

169 maxlen = len = mbmaxlen;

170 }

171 else

172 {

173

174

175

176

177 maxlen = len + (maxlen - charlen);

178 }

179 }

180

184 memcpy(r, s, len);

185

186

187 if (maxlen > len)

188 memset(r + len, ' ', maxlen - len);

189

190 return result;

191}

192

193

194

195

196

199{

201#ifdef NOT_USED

203#endif

206

207 result = bpchar_input(s, strlen(s), atttypmod, fcinfo->context);

209}

210

211

212

213

214

215

216

217

220{

222

224}

225

226

227

228

231{

233#ifdef NOT_USED

235#endif

238 char *str;

239 int nbytes;

240

245}

246

247

248

249

252{

253

255}

256

257

258

259

260

261

262

263

264

265

266

267

268

269

272{

278 char *r;

279 char *s;

280 int i;

281 int charlen;

282

283

284

287

289

292

294

295

296 if (charlen == maxlen)

298

299 if (charlen > maxlen)

300 {

301

302 size_t maxmblen;

303

305

306 if (!isExplicit)

307 {

308 for (i = maxmblen; i < len; i++)

309 if (s[i] != ' ')

311 (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),

312 errmsg("value too long for type character(%d)",

313 maxlen)));

314 }

315

316 len = maxmblen;

317

318

319

320

321

322 maxlen = len;

323 }

324 else

325 {

326

327

328

329

330 maxlen = len + (maxlen - charlen);

331 }

332

334

338

339 memcpy(r, s, len);

340

341

342 if (maxlen > len)

343 memset(r + len, ' ', maxlen - len);

344

346}

347

348

349

350

351

354{

357

359

362

364}

365

366

367

368

369

372{

374 char *s_data;

377

380

381

384

385

386 while (len > 0)

387 {

388 if (s_data[len - 1] != ' ')

389 break;

391 }

392

393

395 memcpy(NameStr(*result), s_data, len);

396

398}

399

400

401

402

403

404

405

408{

411

414}

415

418{

420

422}

423

426{

428

430}

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

458{

460 size_t maxlen;

461

462 maxlen = atttypmod - VARHDRSZ;

463

465 {

466

468 size_t j;

469

470 for (j = mbmaxlen; j < len; j++)

471 {

472 if (s[j] != ' ')

474 (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),

475 errmsg("value too long for type character varying(%d)",

476 (int) maxlen)));

477 }

478

479 len = mbmaxlen;

480 }

481

482

483

484

485

487 return result;

488}

489

490

491

492

493

496{

498#ifdef NOT_USED

500#endif

503

504 result = varchar_input(s, strlen(s), atttypmod, fcinfo->context);

506}

507

508

509

510

511

512

513

514

517{

519

521}

522

523

524

525

528{

530#ifdef NOT_USED

532#endif

535 char *str;

536 int nbytes;

537

542}

543

544

545

546

549{

550

552}

553

554

555

556

557

558

559

560

561

562

563

566{

568 Node *ret = NULL;

569

571 {

574 Node *typmod;

575

577

579

580 if (IsA(typmod, Const) && !((Const *) typmod)->constisnull)

581 {

587

588 if (new_typmod < 0 || (old_typmod >= 0 && old_max <= new_max))

590 }

591 }

592

594}

595

596

597

598

599

600

601

602

603

604

605

606

607

610{

615 maxlen;

616 size_t maxmblen;

617 int i;

618 char *s_data;

619

623

624

625 if (maxlen < 0 || len <= maxlen)

627

628

629

630

632

633 if (!isExplicit)

634 {

635 for (i = maxmblen; i < len; i++)

636 if (s_data[i] != ' ')

638 (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION),

639 errmsg("value too long for type character varying(%d)",

640 maxlen)));

641 }

642

644 maxmblen));

645}

646

649{

651

653}

654

657{

659

661}

662

663

664

665

666

667

668

669static inline int

671{

673}

674

675int

677{

678 int i;

679

680

681

682

683

684 for (i = len - 1; i >= 0; i--)

685 {

686 if (s[i] != ' ')

687 break;

688 }

689 return i + 1;

690}

691

694{

697

698

700

701

704

706}

707

710{

712

713

715}

716

717

718

719

720

721

722

723

724

725

726static void

728{

730 {

731

732

733

734

736 (errcode(ERRCODE_INDETERMINATE_COLLATION),

737 errmsg("could not determine which collation to use for string comparison"),

738 errhint("Use the COLLATE clause to set the collation explicitly.")));

739 }

740}

741

744{

747 int len1,

748 len2;

749 bool result;

752

754

757

759

761 {

762

763

764

765

766 if (len1 != len2)

767 result = false;

768 else

770 }

771 else

772 {

775 }

776

779

781}

782

785{

788 int len1,

789 len2;

790 bool result;

793

795

798

800

802 {

803

804

805

806

807 if (len1 != len2)

808 result = true;

809 else

811 }

812 else

813 {

816 }

817

820

822}

823

826{

829 int len1,

830 len2;

832

835

838

841

843}

844

847{

850 int len1,

851 len2;

853

856

859

862

864}

865

868{

871 int len1,

872 len2;

874

877

880

883

885}

886

889{

892 int len1,

893 len2;

895

898

901

904

906}

907

910{

913 int len1,

914 len2;

916

919

922

925

927}

928

931{

935

937

938

940

942

944}

945

948{

951 int len1,

952 len2;

954

957

960

962}

963

966{

969 int len1,

970 len2;

972

975

978

980}

981

982

983

984

985

986

989{

992 char *keydata;

993 int keylen;

996

999 (errcode(ERRCODE_INDETERMINATE_COLLATION),

1000 errmsg("could not determine which collation to use for string hashing"),

1001 errhint("Use the COLLATE clause to set the collation explicitly.")));

1002

1005

1007

1009 {

1010 result = hash_any((unsigned char *) keydata, keylen);

1011 }

1012 else

1013 {

1015 rsize;

1016 char *buf;

1017

1018 bsize = pg_strnxfrm(NULL, 0, keydata, keylen, mylocale);

1020

1021 rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale);

1022

1023

1024 if (rsize > bsize)

1025 elog(ERROR, "pg_strnxfrm() returned unexpected result");

1026

1027

1028

1029

1030

1031

1032 result = hash_any((uint8_t *) buf, bsize + 1);

1033

1035 }

1036

1037

1039

1040 return result;

1041}

1042

1045{

1048 char *keydata;

1049 int keylen;

1052

1055 (errcode(ERRCODE_INDETERMINATE_COLLATION),

1056 errmsg("could not determine which collation to use for string hashing"),

1057 errhint("Use the COLLATE clause to set the collation explicitly.")));

1058

1061

1063

1065 {

1068 }

1069 else

1070 {

1072 rsize;

1073 char *buf;

1074

1075 bsize = pg_strnxfrm(NULL, 0, keydata, keylen, mylocale);

1077

1078 rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale);

1079

1080

1081 if (rsize > bsize)

1082 elog(ERROR, "pg_strnxfrm() returned unexpected result");

1083

1084

1085

1086

1087

1088

1091

1093 }

1094

1096

1097 return result;

1098}

1099

1100

1101

1102

1103

1104

1105

1106

1107

1108static int

1110{

1111 int result;

1112 int len1,

1113 len2;

1114

1117

1119 if (result != 0)

1120 return result;

1121 else if (len1 < len2)

1122 return -1;

1123 else if (len1 > len2)

1124 return 1;

1125 else

1126 return 0;

1127}

1128

1129

1132{

1135 int result;

1136

1138

1141

1143}

1144

1145

1148{

1151 int result;

1152

1154

1157

1159}

1160

1161

1164{

1167 int result;

1168

1170

1173

1175}

1176

1177

1180{

1183 int result;

1184

1186

1189

1191}

1192

1193

1196{

1199 int result;

1200

1202

1205

1207}

1208

1209

1212{

1215

1217

1218

1220

1222

1224}

#define PG_GETARG_ARRAYTYPE_P(n)

int32 * ArrayGetIntegerTypmods(ArrayType *arr, int *n)

#define TextDatumGetCString(d)

#define OidIsValid(objectId)

Size toast_raw_datum_size(Datum value)

int errhint(const char *fmt,...)

int errcode(int sqlerrcode)

int errmsg(const char *fmt,...)

#define ereturn(context, dummy_value,...)

#define ereport(elevel,...)

#define PG_FREE_IF_COPY(ptr, n)

#define PG_GETARG_CHAR(n)

#define PG_GETARG_POINTER(n)

#define PG_RETURN_CSTRING(x)

#define PG_GETARG_DATUM(n)

#define PG_GETARG_CSTRING(n)

#define PG_GETARG_INT64(n)

#define PG_GETARG_NAME(n)

#define PG_GETARG_BPCHAR_PP(n)

#define PG_GETARG_VARCHAR_PP(n)

#define PG_RETURN_BPCHAR_P(x)

#define PG_RETURN_INT32(x)

#define PG_RETURN_NAME(x)

#define PG_GETARG_INT32(n)

#define PG_GETARG_BOOL(n)

#define PG_RETURN_POINTER(x)

#define PG_GET_COLLATION()

#define PG_RETURN_VARCHAR_P(x)

#define PG_RETURN_BOOL(x)

static Datum hash_any_extended(const unsigned char *k, int keylen, uint64 seed)

static Datum hash_any(const unsigned char *k, int keylen)

Assert(PointerIsAligned(start, uint64))

int pg_mbstrlen_with_len(const char *mbstr, int limit)

int pg_mbcharcliplen(const char *mbstr, int len, int limit)

int pg_mbcliplen(const char *mbstr, int len, int limit)

int pg_database_encoding_max_length(void)

void pfree(void *pointer)

void * palloc0(Size size)

int32 exprTypmod(const Node *expr)

Node * relabel_to_typmod(Node *expr, int32 typmod)

#define IsA(nodeptr, _type_)

static MemoryContext MemoryContextSwitchTo(MemoryContext context)

static int list_length(const List *l)

size_t pg_strnxfrm(char *dest, size_t destsize, const char *src, ssize_t srclen, pg_locale_t locale)

pg_locale_t pg_newlocale_from_collation(Oid collid)

static rewind_source * source

static int32 DatumGetInt32(Datum X)

char * pq_getmsgtext(StringInfo msg, int rawbytes, int *nbytes)

static int cmp(const chr *x, const chr *y, size_t len)

struct SortSupportData * SortSupport

StringInfoData * StringInfo

#define SET_VARSIZE(PTR, len)

#define VARSIZE_ANY_EXHDR(PTR)

Datum bpcharrecv(PG_FUNCTION_ARGS)

Datum bpcharne(PG_FUNCTION_ARGS)

Datum varchar_support(PG_FUNCTION_ARGS)

static int bcTruelen(BpChar *arg)

Datum bpchar_larger(PG_FUNCTION_ARGS)

Datum bpchar_pattern_lt(PG_FUNCTION_ARGS)

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

Datum varcharrecv(PG_FUNCTION_ARGS)

Datum varcharout(PG_FUNCTION_ARGS)

int bpchartruelen(char *s, int len)

Datum bpchar_pattern_le(PG_FUNCTION_ARGS)

Datum bpcharsend(PG_FUNCTION_ARGS)

Datum varcharsend(PG_FUNCTION_ARGS)

Datum bpcharlen(PG_FUNCTION_ARGS)

Datum bpchar(PG_FUNCTION_ARGS)

Datum name_bpchar(PG_FUNCTION_ARGS)

Datum bpchar_sortsupport(PG_FUNCTION_ARGS)

Datum bpchargt(PG_FUNCTION_ARGS)

Datum btbpchar_pattern_sortsupport(PG_FUNCTION_ARGS)

static char * anychar_typmodout(int32 typmod)

Datum bpcharge(PG_FUNCTION_ARGS)

static int internal_bpchar_pattern_compare(BpChar *arg1, BpChar *arg2)

Datum bpchar_pattern_ge(PG_FUNCTION_ARGS)

static void check_collation_set(Oid collid)

Datum bpchartypmodout(PG_FUNCTION_ARGS)

Datum varcharin(PG_FUNCTION_ARGS)

Datum bpchartypmodin(PG_FUNCTION_ARGS)

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

Datum varchar(PG_FUNCTION_ARGS)

Datum bpcharlt(PG_FUNCTION_ARGS)

Datum hashbpcharextended(PG_FUNCTION_ARGS)

Datum bpchar_smaller(PG_FUNCTION_ARGS)

Datum bpcharout(PG_FUNCTION_ARGS)

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

Datum bpcharcmp(PG_FUNCTION_ARGS)

Datum bpchareq(PG_FUNCTION_ARGS)

Datum btbpchar_pattern_cmp(PG_FUNCTION_ARGS)

Datum bpchar_name(PG_FUNCTION_ARGS)

Datum bpcharin(PG_FUNCTION_ARGS)

Datum varchartypmodin(PG_FUNCTION_ARGS)

Datum varchartypmodout(PG_FUNCTION_ARGS)

Datum bpcharle(PG_FUNCTION_ARGS)

Datum bpcharoctetlen(PG_FUNCTION_ARGS)

Datum bpchar_pattern_gt(PG_FUNCTION_ARGS)

Datum char_bpchar(PG_FUNCTION_ARGS)

Datum hashbpchar(PG_FUNCTION_ARGS)

Datum textsend(PG_FUNCTION_ARGS)

int varstr_cmp(const char *arg1, int len1, const char *arg2, int len2, Oid collid)

text * cstring_to_text_with_len(const char *s, int len)

void varstr_sortsupport(SortSupport ssup, Oid typid, Oid collid)

text * cstring_to_text(const char *s)