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

1

2

3

4

5

6

7

8

9

10

11

12

13

15

21#include "utils/fmgrprotos.h"

26

27

28

29

30

31

32

33

34

35

36#define JSONB_MAX_ELEMS (Min(MaxAllocSize / sizeof(JsonbValue), JB_CMASK))

37#define JSONB_MAX_PAIRS (Min(MaxAllocSize / sizeof(JsonbPair), JB_CMASK))

38

40 char *base_addr, uint32 offset,

49

54

63 const char *val2, int len2);

66 bool skip_nulls);

70

71void

73{

75 val->val.binary.data = &jsonb->root;

77}

78

79

80

81

82

83

84

85

86

87

88

89

90

93{

95

97 {

98

102

104 scalarArray.val.array.rawScalar = true;

105 scalarArray.val.array.nElems = 1;

106

110

112 }

114 {

116 }

117 else

118 {

122 memcpy(VARDATA(out), val->val.binary.data, val->val.binary.len);

123 }

124

125 return out;

126}

127

128

129

130

131

132

135{

137 int i;

138

139

140

141

142

143

144 for (i = index - 1; i >= 0; i--)

145 {

148 break;

149 }

150

151 return offset;

152}

153

154

155

156

157

160{

163

164

165

166

167

168

170 {

173 }

174 else

176

177 return len;

178}

179

180

181

182

183

184

185

186

187

188

189

190int

192{

194 *itb;

195 int res = 0;

196

199

200 do

201 {

203 vb;

205 rb;

206

209

210 if (ra == rb)

211 {

213 {

214

215 break;

216 }

217

219 {

220

221

222

223

224

225

226 continue;

227 }

228

230 {

231 switch (va.type)

232 {

238 break;

240

241

242

243

244

245

246

247 if (va.val.array.rawScalar != vb.val.array.rawScalar)

248 res = (va.val.array.rawScalar) ? -1 : 1;

249

250

251

252

253

254

255

256 if (va.val.array.nElems != vb.val.array.nElems)

257 res = (va.val.array.nElems > vb.val.array.nElems) ? 1 : -1;

258 break;

260 if (va.val.object.nPairs != vb.val.object.nPairs)

261 res = (va.val.object.nPairs > vb.val.object.nPairs) ? 1 : -1;

262 break;

264 elog(ERROR, "unexpected jbvBinary value");

265 break;

267 elog(ERROR, "unexpected jbvDatetime value");

268 break;

269 }

270 }

271 else

272 {

273

274 res = (va.type > vb.type) ? 1 : -1;

275 }

276 }

277 else

278 {

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

296

300

301 res = (va.type > vb.type) ? 1 : -1;

302 }

303 }

304 while (res == 0);

305

306 while (ita != NULL)

307 {

309

311 ita = i;

312 }

313 while (itb != NULL)

314 {

316

318 itb = i;

319 }

320

321 return res;

322}

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

353{

356

358

359

360 if (count <= 0)

361 return NULL;

362

364 {

366 char *base_addr = (char *) (children + count);

368 int i;

369

370 for (i = 0; i < count; i++)

371 {

373

374 if (key->type == result->type)

375 {

377 return result;

378 }

379

381 }

382

384 }

386 {

387

389

391 key->val.string.len, NULL);

392 }

393

394

395 return NULL;

396}

397

398

399

400

401

402

403

406 const char *keyVal, int keyLen, JsonbValue *res)

407{

410 char *baseAddr;

412 stopHigh;

413

415

416

417 if (count <= 0)

418 return NULL;

419

420

421

422

423

424 baseAddr = (char *) (children + count * 2);

425 stopLow = 0;

426 stopHigh = count;

427 while (stopLow < stopHigh)

428 {

431 const char *candidateVal;

432 int candidateLen;

433

434 stopMiddle = stopLow + (stopHigh - stopLow) / 2;

435

436 candidateVal = baseAddr + getJsonbOffset(container, stopMiddle);

437 candidateLen = getJsonbLength(container, stopMiddle);

438

440 keyVal, keyLen);

441

443 {

444

445 int index = stopMiddle + count;

446

447 if (!res)

449

452 res);

453

454 return res;

455 }

456 else

457 {

459 stopLow = stopMiddle + 1;

460 else

461 stopHigh = stopMiddle;

462 }

463 }

464

465

466 return NULL;

467}

468

469

470

471

472

473

476{

478 char *base_addr;

480

482 elog(ERROR, "not a jsonb array");

483

485 base_addr = (char *) &container->children[nelements];

486

487 if (i >= nelements)

488 return NULL;

489

491

494 result);

495

496 return result;

497}

498

499

500

501

502

503

504

505

506

507

508

509

510

511static void

513 char *base_addr, uint32 offset,

515{

517

519 {

521 }

523 {

525 result->val.string.val = base_addr + offset;

527 Assert(result->val.string.len >= 0);

528 }

530 {

533 }

535 {

537 result->val.boolean = true;

538 }

540 {

542 result->val.boolean = false;

543 }

544 else

545 {

548

552 }

553}

554

555

556

557

558

559

560

561

562

563

564

565

566

567

568

569

570

571

575{

580 int i;

581

583 {

585 for (i = 0; i < jbval->val.object.nPairs; i++)

586 {

589 }

590

592 }

593

595 {

597 for (i = 0; i < jbval->val.array.nElems; i++)

598 {

600 }

601

603 }

604

607 {

608

610 }

611

612

614

615 if ((jbval->val.binary.data->header & JB_FSCALAR) && *pstate)

616 {

620

623

625

629

630 return res;

631 }

632

637 v.val.array.rawScalar) ? &v : NULL);

638

639 return res;

640}

641

642

643

644

645

649{

651

652 switch (seq)

653 {

655 Assert(!scalarVal || scalarVal->val.array.rawScalar);

657 result = &(*pstate)->contVal;

659 (*pstate)->contVal.val.array.nElems = 0;

660 (*pstate)->contVal.val.array.rawScalar = (scalarVal &&

661 scalarVal->val.array.rawScalar);

662 if (scalarVal && scalarVal->val.array.nElems > 0)

663 {

664

666 (*pstate)->size = scalarVal->val.array.nElems;

667 }

668 else

669 {

670 (*pstate)->size = 4;

671 }

672 (*pstate)->contVal.val.array.elems = palloc(sizeof(JsonbValue) *

673 (*pstate)->size);

674 break;

678 result = &(*pstate)->contVal;

680 (*pstate)->contVal.val.object.nPairs = 0;

681 (*pstate)->size = 4;

682 (*pstate)->contVal.val.object.pairs = palloc(sizeof(JsonbPair) *

683 (*pstate)->size);

684 break;

688 break;

692 break;

696 break;

699 (*pstate)->unique_keys,

700 (*pstate)->skip_nulls);

701

703

705 result = &(*pstate)->contVal;

706

707

708

709

710

711 *pstate = (*pstate)->next;

712 if (*pstate)

713 {

714 switch ((*pstate)->contVal.type)

715 {

718 break;

721 break;

722 default:

723 elog(ERROR, "invalid jsonb container type");

724 }

725 }

726 break;

727 default:

728 elog(ERROR, "unrecognized jsonb sequential processing token");

729 }

730

731 return result;

732}

733

734

735

736

739{

741

742 ns->next = *pstate;

745

746 return ns;

747}

748

749

750

751

752static void

754{

756

759

762 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

763 errmsg("number of jsonb object pairs exceeds the maximum allowed (%zu)",

765

766 if (object->val.object.nPairs >= pstate->size)

767 {

768 pstate->size *= 2;

769 object->val.object.pairs = repalloc(object->val.object.pairs,

771 }

772

773 object->val.object.pairs[object->val.object.nPairs].key = *string;

774 object->val.object.pairs[object->val.object.nPairs].order = object->val.object.nPairs;

775}

776

777

778

779

780

781static void

783{

785

787

788 object->val.object.pairs[object->val.object.nPairs++].value = *scalarVal;

789}

790

791

792

793

794static void

796{

798

800

803 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

804 errmsg("number of jsonb array elements exceeds the maximum allowed (%zu)",

806

807 if (array->val.array.nElems >= pstate->size)

808 {

809 pstate->size *= 2;

810 array->val.array.elems = repalloc(array->val.array.elems,

812 }

813

814 array->val.array.elems[array->val.array.nElems++] = *scalarVal;

815}

816

817

818

819

820

821

822

825{

827}

828

829

830

831

832

833

834

835

836

837

838

839

840

841

842

843

844

845

846

847

848

849

850

851

852

853

854

855

856

857

858

861{

862 if (*it == NULL)

864

865

866

867

868

869

870

871recurse:

872 switch ((*it)->state)

873 {

875

877 val->val.array.nElems = (*it)->nElems;

878

879

880

881

882

883 val->val.array.rawScalar = (*it)->isScalar;

884 (*it)->curIndex = 0;

885 (*it)->curDataOffset = 0;

886 (*it)->curValueOffset = 0;

887

890

892 if ((*it)->curIndex >= (*it)->nElems)

893 {

894

895

896

897

898

899

902 }

903

905 (*it)->dataProper, (*it)->curDataOffset,

907

909 (*it)->children[(*it)->curIndex]);

910 (*it)->curIndex++;

911

913 {

914

916 goto recurse;

917 }

918 else

919 {

920

921

922

923

925 }

926

928

930 val->val.object.nPairs = (*it)->nElems;

931

932

933

934

935

936 (*it)->curIndex = 0;

937 (*it)->curDataOffset = 0;

938 (*it)->curValueOffset = getJsonbOffset((*it)->container,

939 (*it)->nElems);

940

943

945 if ((*it)->curIndex >= (*it)->nElems)

946 {

947

948

949

950

951

952

955 }

956 else

957 {

958

960 (*it)->dataProper, (*it)->curDataOffset,

963 elog(ERROR, "unexpected jsonb type as object key");

964

965

968 }

969

971

973

974 fillJsonbValue((*it)->container, (*it)->curIndex + (*it)->nElems,

975 (*it)->dataProper, (*it)->curValueOffset,

977

979 (*it)->children[(*it)->curIndex]);

981 (*it)->children[(*it)->curIndex + (*it)->nElems]);

982 (*it)->curIndex++;

983

984

985

986

987

988

990 {

992 goto recurse;

993 }

994 else

996 }

997

998 elog(ERROR, "invalid iterator state");

999 return -1;

1000}

1001

1002

1003

1004

1007{

1009

1012 it->parent = parent;

1014

1015

1017

1019 {

1024

1026

1028 break;

1029

1034 break;

1035

1036 default:

1037 elog(ERROR, "unknown type of jsonb container");

1038 }

1039

1040 return it;

1041}

1042

1043

1044

1045

1046

1049{

1051

1053 return v;

1054}

1055

1056

1057

1058

1059

1060

1061

1062

1063

1064

1065

1066

1067

1068bool

1070{

1072 vcontained;

1074 rcont;

1075

1076

1077

1078

1079

1080

1081

1083

1086

1087 if (rval != rcont)

1088 {

1089

1090

1091

1092

1093

1094

1097 return false;

1098 }

1100 {

1103

1104

1105

1106

1107

1108

1109

1110

1111 if (vval.val.object.nPairs < vcontained.val.object.nPairs)

1112 return false;

1113

1114

1115 for (;;)

1116 {

1117 JsonbValue *lhsVal;

1119

1121

1122

1123

1124

1125

1126

1128 return true;

1129

1132

1133

1134 lhsVal =

1136 vcontained.val.string.val,

1137 vcontained.val.string.len,

1138 &lhsValBuf);

1139 if (!lhsVal)

1140 return false;

1141

1142

1143

1144

1145

1147

1149

1150

1151

1152

1153

1154 if (lhsVal->type != vcontained.type)

1155 {

1156 return false;

1157 }

1159 {

1161 return false;

1162 }

1163 else

1164 {

1165

1167 *nestContained;

1168

1171

1174

1175

1176

1177

1178

1179

1180

1181

1182

1183

1184

1185

1186

1187

1188

1189

1190

1191

1192

1193

1194

1196 return false;

1197 }

1198 }

1199 }

1201 {

1203 uint32 nLhsElems = vval.val.array.nElems;

1204

1207

1208

1209

1210

1211

1212

1213

1214

1215

1216

1217

1218 if (vval.val.array.rawScalar && !vcontained.val.array.rawScalar)

1219 return false;

1220

1221

1222 for (;;)

1223 {

1225

1226

1227

1228

1229

1230

1232 return true;

1233

1235

1237 {

1240 &vcontained))

1241 return false;

1242 }

1243 else

1244 {

1246

1247

1248

1249

1250

1251 if (lhsConts == NULL)

1252 {

1254

1255

1257

1258 for (i = 0; i < nLhsElems; i++)

1259 {

1260

1263

1265 lhsConts[j++] = vval;

1266 }

1267

1268

1269 if (j == 0)

1270 return false;

1271

1272

1273 nLhsElems = j;

1274 }

1275

1276

1277 for (i = 0; i < nLhsElems; i++)

1278 {

1279

1281 *nestContained;

1282 bool contains;

1283

1286

1288

1289 if (nestval)

1291 if (nestContained)

1292 pfree(nestContained);

1293 if (contains)

1294 break;

1295 }

1296

1297

1298

1299

1300

1301 if (i == nLhsElems)

1302 return false;

1303 }

1304 }

1305 }

1306 else

1307 {

1308 elog(ERROR, "invalid jsonb container type");

1309 }

1310

1311 elog(ERROR, "unexpectedly fell off end of jsonb container");

1312 return false;

1313}

1314

1315

1316

1317

1318

1319

1320

1321

1322void

1324{

1326

1327

1328 switch (scalarVal->type)

1329 {

1331 tmp = 0x01;

1332 break;

1335 scalarVal->val.string.len));

1336 break;

1338

1341 break;

1343 tmp = scalarVal->val.boolean ? 0x02 : 0x04;

1344

1345 break;

1346 default:

1347 elog(ERROR, "invalid jsonb scalar type");

1348 tmp = 0;

1349 break;

1350 }

1351

1352

1353

1354

1355

1356

1358 *hash ^= tmp;

1359}

1360

1361

1362

1363

1364

1365void

1368{

1370

1371 switch (scalarVal->type)

1372 {

1374 tmp = seed + 0x01;

1375 break;

1378 scalarVal->val.string.len,

1379 seed));

1380 break;

1385 break;

1387 if (seed)

1391 else

1392 tmp = scalarVal->val.boolean ? 0x02 : 0x04;

1393

1394 break;

1395 default:

1396 elog(ERROR, "invalid jsonb scalar type");

1397 break;

1398 }

1399

1401 *hash ^= tmp;

1402}

1403

1404

1405

1406

1407static bool

1409{

1410 if (a->type == b->type)

1411 {

1412 switch (a->type)

1413 {

1415 return true;

1423 return a->val.boolean == b->val.boolean;

1424

1425 default:

1426 elog(ERROR, "invalid jsonb scalar type");

1427 }

1428 }

1429 elog(ERROR, "jsonb scalar type mismatch");

1430 return false;

1431}

1432

1433

1434

1435

1436

1437

1438

1439static int

1441{

1442 if (a->type == b->type)

1443 {

1444 switch (a->type)

1445 {

1447 return 0;

1450 a->val.string.len,

1451 b->val.string.val,

1452 b->val.string.len,

1453 DEFAULT_COLLATION_OID);

1459 if (a->val.boolean == b->val.boolean)

1460 return 0;

1461 else if (a->val.boolean > b->val.boolean)

1462 return 1;

1463 else

1464 return -1;

1465 default:

1466 elog(ERROR, "invalid jsonb scalar type");

1467 }

1468 }

1469 elog(ERROR, "jsonb scalar type mismatch");

1470 return -1;

1471}

1472

1473

1474

1475

1476

1477

1478

1479

1480

1481

1482

1483

1484static int

1486{

1487 int offset;

1488

1489

1491

1492

1493 offset = buffer->len;

1494

1495

1497

1498

1499

1500

1501

1502 buffer->data[buffer->len] = '\0';

1503

1504 return offset;

1505}

1506

1507

1508

1509

1510static void

1512{

1513 memcpy(buffer->data + offset, data, len);

1514}

1515

1516

1517

1518

1519static void

1521{

1522 int offset;

1523

1526}

1527

1528

1529

1530

1531

1532

1533static short

1535{

1536 int padlen,

1537 p,

1538 offset;

1539

1541

1543

1544

1545 for (p = 0; p < padlen; p++)

1546 buffer->data[offset + p] = '\0';

1547

1548 return padlen;

1549}

1550

1551

1552

1553

1556{

1560

1561

1563

1564

1566

1567

1569

1571

1572

1573

1574

1575

1576

1577

1579

1581

1582 return res;

1583}

1584

1585

1586

1587

1588

1589

1590

1591

1592

1593

1594

1595

1596static void

1598{

1600

1601 if (val)

1602 return;

1603

1604

1605

1606

1607

1608

1609

1610

1617 else

1618 elog(ERROR, "unknown type of jsonb container to convert");

1619}

1620

1621static void

1623{

1624 int base_offset;

1625 int jentry_offset;

1626 int i;

1627 int totallen;

1628 uint32 containerhead;

1629 int nElems = val->val.array.nElems;

1630

1631

1632 base_offset = buffer->len;

1633

1634

1636

1637

1638

1639

1640

1641 containerhead = nElems | JB_FARRAY;

1642 if (val->val.array.rawScalar)

1643 {

1644 Assert(nElems == 1);

1647 }

1648

1650

1651

1653

1654 totallen = 0;

1655 for (i = 0; i < nElems; i++)

1656 {

1658 int len;

1660

1661

1662

1663

1664

1666

1668 totallen += len;

1669

1670

1671

1672

1673

1674

1677 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

1678 errmsg("total size of jsonb array elements exceeds the maximum of %d bytes",

1680

1681

1682

1683

1686

1688 jentry_offset += sizeof(JEntry);

1689 }

1690

1691

1692 totallen = buffer->len - base_offset;

1693

1694

1697 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

1698 errmsg("total size of jsonb array elements exceeds the maximum of %d bytes",

1700

1701

1703}

1704

1705static void

1707{

1708 int base_offset;

1709 int jentry_offset;

1710 int i;

1711 int totallen;

1712 uint32 containerheader;

1713 int nPairs = val->val.object.nPairs;

1714

1715

1716 base_offset = buffer->len;

1717

1718

1720

1721

1722

1723

1724

1725 containerheader = nPairs | JB_FOBJECT;

1727

1728

1730

1731

1732

1733

1734

1735 totallen = 0;

1736 for (i = 0; i < nPairs; i++)

1737 {

1739 int len;

1741

1742

1743

1744

1745

1747

1749 totallen += len;

1750

1751

1752

1753

1754

1755

1758 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

1759 errmsg("total size of jsonb object elements exceeds the maximum of %d bytes",

1761

1762

1763

1764

1767

1769 jentry_offset += sizeof(JEntry);

1770 }

1771 for (i = 0; i < nPairs; i++)

1772 {

1774 int len;

1776

1777

1778

1779

1780

1782

1784 totallen += len;

1785

1786

1787

1788

1789

1790

1793 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

1794 errmsg("total size of jsonb object elements exceeds the maximum of %d bytes",

1796

1797

1798

1799

1802

1804 jentry_offset += sizeof(JEntry);

1805 }

1806

1807

1808 totallen = buffer->len - base_offset;

1809

1810

1813 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

1814 errmsg("total size of jsonb object elements exceeds the maximum of %d bytes",

1816

1817

1819}

1820

1821static void

1823{

1824 int numlen;

1825 short padlen;

1826

1827 switch (scalarVal->type)

1828 {

1831 break;

1832

1834 appendToBuffer(buffer, scalarVal->val.string.val, scalarVal->val.string.len);

1835

1836 *header = scalarVal->val.string.len;

1837 break;

1838

1842

1844

1846 break;

1847

1849 *header = (scalarVal->val.boolean) ?

1851 break;

1852

1854 {

1856 size_t len;

1857

1859 scalarVal->val.datetime.value,

1860 scalarVal->val.datetime.typid,

1861 &scalarVal->val.datetime.tz);

1864

1865 *header = len;

1866 }

1867 break;

1868

1869 default:

1870 elog(ERROR, "invalid jsonb scalar type");

1871 }

1872}

1873

1874

1875

1876

1877

1878

1879

1880

1881

1882

1883

1884

1885

1886static int

1888{

1891

1894

1896 vb->val.string.val, vb->val.string.len);

1897}

1898

1899

1900

1901

1902

1903

1904

1905static int

1907{

1908 if (len1 == len2)

1909 return memcmp(val1, val2, len1);

1910 else

1911 return len1 > len2 ? 1 : -1;

1912}

1913

1914

1915

1916

1917

1918

1919

1920

1921

1922

1923

1924

1925static int

1927{

1930 int res;

1931

1933 if (res == 0 && binequal)

1934 *((bool *) binequal) = true;

1935

1936

1937

1938

1939

1940 if (res == 0)

1941 res = (pa->order > pb->order) ? -1 : 1;

1942

1943 return res;

1944}

1945

1946

1947

1948

1949static void

1951{

1952 bool hasNonUniq = false;

1953

1955

1956 if (object->val.object.nPairs > 1)

1959

1960 if (hasNonUniq && unique_keys)

1962 errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE),

1963 errmsg("duplicate JSON object key value"));

1964

1965 if (hasNonUniq || skip_nulls)

1966 {

1968 *res;

1969

1970 while (skip_nulls && object->val.object.nPairs > 0 &&

1971 object->val.object.pairs->value.type == jbvNull)

1972 {

1973

1974 object->val.object.pairs++;

1975 object->val.object.nPairs--;

1976 }

1977

1978 if (object->val.object.nPairs > 0)

1979 {

1980 ptr = object->val.object.pairs + 1;

1981 res = object->val.object.pairs;

1982

1983 while (ptr - object->val.object.pairs < object->val.object.nPairs)

1984 {

1985

1988 {

1989 res++;

1990 if (ptr != res)

1991 memcpy(res, ptr, sizeof(JsonbPair));

1992 }

1993 ptr++;

1994 }

1995

1996 object->val.object.nPairs = res + 1 - object->val.object.pairs;

1997 }

1998 }

1999}

Datum hash_numeric(PG_FUNCTION_ARGS)

Datum hash_numeric_extended(PG_FUNCTION_ARGS)

Datum numeric_cmp(PG_FUNCTION_ARGS)

Datum numeric_eq(PG_FUNCTION_ARGS)

int errcode(int sqlerrcode)

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

#define ereport(elevel,...)

#define DirectFunctionCall2(func, arg1, arg2)

#define DirectFunctionCall1(func, arg1)

Datum difference(PG_FUNCTION_ARGS)

#define ROTATE_HIGH_AND_LOW_32BITS(v)

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))

Datum hashcharextended(PG_FUNCTION_ARGS)

if(TABLE==NULL||TABLE_index==NULL)

char * JsonEncodeDateTime(char *buf, Datum value, Oid typid, const int *tzp)

#define JsonContainerIsScalar(jc)

#define JsonContainerIsArray(jc)

#define JsonContainerSize(jc)

#define JBE_ISBOOL_TRUE(je_)

#define IsAJsonbScalar(jsonbval)

#define JENTRY_OFFLENMASK

#define JBE_ISNUMERIC(je_)

#define JBE_ISBOOL_FALSE(je_)

#define JENTRY_ISCONTAINER

#define JBE_ISSTRING(je_)

#define JENTRY_ISBOOL_FALSE

#define JBE_OFFLENFLD(je_)

#define JsonContainerIsObject(jc)

#define JENTRY_ISBOOL_TRUE

#define JBE_ISCONTAINER(je_)

#define JBE_ADVANCE_OFFSET(offset, je)

static int lengthCompareJsonbString(const char *val1, int len1, const char *val2, int len2)

static void appendElement(JsonbParseState *pstate, JsonbValue *scalarVal)

static void convertJsonbScalar(StringInfo buffer, JEntry *header, JsonbValue *scalarVal)

static void convertJsonbObject(StringInfo buffer, JEntry *header, JsonbValue *val, int level)

static int lengthCompareJsonbStringValue(const void *a, const void *b)

static JsonbIterator * iteratorFromContainer(JsonbContainer *container, JsonbIterator *parent)

static void fillJsonbValue(JsonbContainer *container, int index, char *base_addr, uint32 offset, JsonbValue *result)

static void copyToBuffer(StringInfo buffer, int offset, const void *data, int len)

static void convertJsonbArray(StringInfo buffer, JEntry *header, JsonbValue *val, int level)

static void appendToBuffer(StringInfo buffer, const void *data, int len)

static void uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls)

static void appendValue(JsonbParseState *pstate, JsonbValue *scalarVal)

static JsonbValue * pushJsonbValueScalar(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *scalarVal)

JsonbValue * getKeyJsonValueFromContainer(JsonbContainer *container, const char *keyVal, int keyLen, JsonbValue *res)

int compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)

uint32 getJsonbLength(const JsonbContainer *jc, int index)

static short padBufferToInt(StringInfo buffer)

JsonbValue * pushJsonbValue(JsonbParseState **pstate, JsonbIteratorToken seq, JsonbValue *jbval)

JsonbIterator * JsonbIteratorInit(JsonbContainer *container)

void JsonbHashScalarValue(const JsonbValue *scalarVal, uint32 *hash)

static JsonbParseState * pushState(JsonbParseState **pstate)

void JsonbToJsonbValue(Jsonb *jsonb, JsonbValue *val)

JsonbValue * findJsonbValueFromContainer(JsonbContainer *container, uint32 flags, JsonbValue *key)

JsonbIteratorToken JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested)

static int compareJsonbScalarValue(JsonbValue *a, JsonbValue *b)

static void appendKey(JsonbParseState *pstate, JsonbValue *string)

static bool equalsJsonbScalarValue(JsonbValue *a, JsonbValue *b)

uint32 getJsonbOffset(const JsonbContainer *jc, int index)

void JsonbHashScalarValueExtended(const JsonbValue *scalarVal, uint64 *hash, uint64 seed)

static Jsonb * convertToJsonb(JsonbValue *val)

JsonbValue * getIthJsonbValueFromContainer(JsonbContainer *container, uint32 i)

Jsonb * JsonbValueToJsonb(JsonbValue *val)

static int lengthCompareJsonbPair(const void *a, const void *b, void *binequal)

bool JsonbDeepContains(JsonbIterator **val, JsonbIterator **mContained)

static JsonbIterator * freeAndGetParent(JsonbIterator *it)

static void convertJsonbValue(StringInfo buffer, JEntry *header, JsonbValue *val, int level)

static int reserveFromBuffer(StringInfo buffer, int len)

void * repalloc(void *pointer, Size size)

void pfree(void *pointer)

void * palloc0(Size size)

struct NumericData * Numeric

static Datum NumericGetDatum(Numeric X)

static uint32 pg_rotate_left32(uint32 word, int n)

void qsort_arg(void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg)

static uint32 DatumGetUInt32(Datum X)

static uint64 DatumGetUInt64(Datum X)

static bool DatumGetBool(Datum X)

static Datum PointerGetDatum(const void *X)

static Datum UInt64GetDatum(uint64 X)

static Datum BoolGetDatum(bool X)

static int32 DatumGetInt32(Datum X)

static unsigned hash(unsigned *uv, int n)

void check_stack_depth(void)

void enlargeStringInfo(StringInfo str, int needed)

void initStringInfo(StringInfo str)

JEntry children[FLEXIBLE_ARRAY_MEMBER]

struct JsonbIterator * parent

JsonbContainer * container

struct JsonbParseState * next

#define SET_VARSIZE(PTR, len)

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