PostgreSQL Source Code: src/include/utils/array.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61#ifndef ARRAY_H

62#define ARRAY_H

63

66

67

70

71

72

73

74

75#define MAXDIM 6

76

77

78

79

80

81

82#define MaxArraySize ((Size) (MaxAllocSize / sizeof(Datum)))

83

84

85

86

87

88

89

90

91

93{

94 int32 vl_len_;

95 int ndim;

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113#define EA_MAGIC 689375833

114

116{

117

119

120

122

123

124 int ndims;

125 int *dims;

126 int *lbound;

127

128

130 int16 typlen;

133

134

135

136

137

138

139

140

141

142

143

144

145

147 bool *dnulls;

148 int dvalueslen;

149 int nelems;

150

151

152

153

154

155

157

158

159

160

161

162

163

164

166 char *fstartptr;

167 char *fendptr;

169

170

171

172

173

174

175

176

178{

182

183

184

185

186

188{

191 bool *dnulls;

192 int alen;

193 int nelems;

200

201

202

203

204

206{

208 char *data;

210 int abytes;

211 int nbytes;

212 int aitems;

213 int nitems;

214 int ndims;

221

222

223

224

225

227{

228

232

233

234

235

237{

247

248

249

250

252{

256

257

259

260

261#define DatumGetArrayTypeP(X) ((ArrayType *) PG_DETOAST_DATUM(X))

262#define DatumGetArrayTypePCopy(X) ((ArrayType *) PG_DETOAST_DATUM_COPY(X))

263#define PG_GETARG_ARRAYTYPE_P(n) DatumGetArrayTypeP(PG_GETARG_DATUM(n))

264#define PG_GETARG_ARRAYTYPE_P_COPY(n) DatumGetArrayTypePCopy(PG_GETARG_DATUM(n))

265#define PG_RETURN_ARRAYTYPE_P(x) PG_RETURN_POINTER(x)

266

267

268#define PG_GETARG_EXPANDED_ARRAY(n) DatumGetExpandedArray(PG_GETARG_DATUM(n))

269#define PG_GETARG_EXPANDED_ARRAYX(n, metacache) \

270 DatumGetExpandedArrayX(PG_GETARG_DATUM(n), metacache)

271#define PG_RETURN_EXPANDED_ARRAY(x) PG_RETURN_DATUM(EOHPGetRWDatum(&(x)->hdr))

272

273

274#define PG_GETARG_ANY_ARRAY_P(n) DatumGetAnyArrayP(PG_GETARG_DATUM(n))

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289#define ARR_SIZE(a) VARSIZE(a)

290#define ARR_NDIM(a) ((a)->ndim)

291#define ARR_HASNULL(a) ((a)->dataoffset != 0)

292#define ARR_ELEMTYPE(a) ((a)->elemtype)

293

294#define ARR_DIMS(a) \

295 ((int *) (((char *) (a)) + sizeof(ArrayType)))

296#define ARR_LBOUND(a) \

297 ((int *) (((char *) (a)) + sizeof(ArrayType) + \

298 sizeof(int) * ARR_NDIM(a)))

299

300#define ARR_NULLBITMAP(a) \

301 (ARR_HASNULL(a) ? \

302 (bits8 *) (((char *) (a)) + sizeof(ArrayType) + \

303 2 * sizeof(int) * ARR_NDIM(a)) \

304 : (bits8 *) NULL)

305

306

307

308

309

310#define ARR_OVERHEAD_NONULLS(ndims) \

311 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims))

312#define ARR_OVERHEAD_WITHNULLS(ndims, nitems) \

313 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims) + \

314 ((nitems) + 7) / 8)

315

316#define ARR_DATA_OFFSET(a) \

317 (ARR_HASNULL(a) ? (a)->dataoffset : ARR_OVERHEAD_NONULLS(ARR_NDIM(a)))

318

319

320

321

322#define ARR_DATA_PTR(a) \

323 (((char *) (a)) + ARR_DATA_OFFSET(a))

324

325

326

327

328#define AARR_NDIM(a) \

329 (VARATT_IS_EXPANDED_HEADER(a) ? \

330 (a)->xpn.ndims : ARR_NDIM((ArrayType *) (a)))

331#define AARR_HASNULL(a) \

332 (VARATT_IS_EXPANDED_HEADER(a) ? \

333 ((a)->xpn.dvalues != NULL ? (a)->xpn.dnulls != NULL : ARR_HASNULL((a)->xpn.fvalue)) : \

334 ARR_HASNULL((ArrayType *) (a)))

335#define AARR_ELEMTYPE(a) \

336 (VARATT_IS_EXPANDED_HEADER(a) ? \

337 (a)->xpn.element_type : ARR_ELEMTYPE((ArrayType *) (a)))

338#define AARR_DIMS(a) \

339 (VARATT_IS_EXPANDED_HEADER(a) ? \

340 (a)->xpn.dims : ARR_DIMS((ArrayType *) (a)))

341#define AARR_LBOUND(a) \

342 (VARATT_IS_EXPANDED_HEADER(a) ? \

343 (a)->xpn.lbound : ARR_LBOUND((ArrayType *) (a)))

344

345

346

347

348

350

351

352

353

356 bool *nulls,

361 bool freedata);

362

364 int arraytyplen, int elmlen, bool elmbyval, char elmalign,

365 bool *isNull);

367 Datum dataValue, bool isNull,

368 int arraytyplen, int elmlen, bool elmbyval, char elmalign);

370 int *upperIndx, int *lowerIndx,

371 bool *upperProvided, bool *lowerProvided,

372 int arraytyplen, int elmlen, bool elmbyval, char elmalign);

374 int *upperIndx, int *lowerIndx,

375 bool *upperProvided, bool *lowerProvided,

376 Datum srcArrayDatum, bool isNull,

377 int arraytyplen, int elmlen, bool elmbyval, char elmalign);

378

380 int arraytyplen, int elmlen, bool elmbyval, char elmalign,

381 bool *isNull);

383 Datum dataValue, bool isNull,

384 int arraytyplen, int elmlen, bool elmbyval, char elmalign);

385

389

391 const bits8 *srcbitmap, int srcoffset,

393

395 Oid elmtype,

396 int elmlen, bool elmbyval, char elmalign);

399 bool *nulls,

400 int ndims,

401 int *dims,

402 int *lbs,

403 Oid elmtype, int elmlen, bool elmbyval, char elmalign);

409 Oid elmtype,

410 int elmlen, bool elmbyval, char elmalign,

411 Datum **elemsp, bool **nullsp, int *nelemsp);

413 Oid elmtype,

414 Datum **elemsp, bool **nullsp, int *nelemsp);

416

421 bool subcontext, int initsize);

423 Datum dvalue, bool disnull,

424 Oid element_type,

429 int *dims, int *lbs, MemoryContext rcontext, bool release);

430

434 Datum dvalue, bool disnull,

435 Oid array_type,

439

443 Datum dvalue, bool disnull,

444 Oid input_type,

448

452

453

454

455

456

457extern int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx);

460 struct Node *escontext);

461extern void ArrayCheckBounds(int ndim, const int *dims, const int *lb);

463 struct Node *escontext);

464extern void mda_get_range(int n, int *span, const int *st, const int *endp);

466extern void mda_get_offset_values(int n, int *dist, const int *prod, const int *span);

467extern int mda_next_tuple(int n, int *curr, const int *span);

469

470

471

472

480

481#endif

struct ArrayMapState ArrayMapState

void mda_get_offset_values(int n, int *dist, const int *prod, const int *span)

int ArrayGetNItemsSafe(int ndim, const int *dims, struct Node *escontext)

ArrayType * array_set(ArrayType *array, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)

bool array_contains_nulls(ArrayType *array)

ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)

struct ExpandedArrayHeader ExpandedArrayHeader

ExpandedArrayHeader * construct_empty_expanded_array(Oid element_type, MemoryContext parentcontext, ArrayMetaState *metacache)

bool array_iterate(ArrayIterator iterator, Datum *value, bool *isnull)

bool ArrayCheckBoundsSafe(int ndim, const int *dims, const int *lb, struct Node *escontext)

void array_free_iterator(ArrayIterator iterator)

int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx)

ArrayBuildStateAny * initArrayResultAny(Oid input_type, MemoryContext rcontext, bool subcontext)

ArrayBuildStateAny * accumArrayResultAny(ArrayBuildStateAny *astate, Datum dvalue, bool disnull, Oid input_type, MemoryContext rcontext)

ArrayType * construct_empty_array(Oid elmtype)

void CopyArrayEls(ArrayType *array, Datum *values, bool *nulls, int nitems, int typlen, bool typbyval, char typalign, bool freedata)

struct ArrayBuildStateAny ArrayBuildStateAny

ExpandedArrayHeader * DatumGetExpandedArrayX(Datum d, ArrayMetaState *metacache)

Datum expand_array(Datum arraydatum, MemoryContext parentcontext, ArrayMetaState *metacache)

Datum makeArrayResultArr(ArrayBuildStateArr *astate, MemoryContext rcontext, bool release)

void mda_get_range(int n, int *span, const int *st, const int *endp)

int ArrayGetNItems(int ndim, const int *dims)

Datum makeArrayResultAny(ArrayBuildStateAny *astate, MemoryContext rcontext, bool release)

ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)

Datum array_set_element(Datum arraydatum, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)

Datum makeMdArrayResult(ArrayBuildState *astate, int ndims, int *dims, int *lbs, MemoryContext rcontext, bool release)

void mda_get_prod(int n, const int *range, int *prod)

PGDLLIMPORT bool Array_nulls

ArrayBuildStateArr * initArrayResultArr(Oid array_type, Oid element_type, MemoryContext rcontext, bool subcontext)

void ArrayCheckBounds(int ndim, const int *dims, const int *lb)

ArrayBuildStateArr * accumArrayResultArr(ArrayBuildStateArr *astate, Datum dvalue, bool disnull, Oid array_type, MemoryContext rcontext)

struct ArrayMetaState ArrayMetaState

ArrayIterator array_create_iterator(ArrayType *arr, int slice_ndim, ArrayMetaState *mstate)

int mda_next_tuple(int n, int *curr, const int *span)

struct ArrayIteratorData * ArrayIterator

Datum array_ref(ArrayType *array, int nSubscripts, int *indx, int arraytyplen, int elmlen, bool elmbyval, char elmalign, bool *isNull)

Datum array_map(Datum arrayd, struct ExprState *exprstate, struct ExprContext *econtext, Oid retType, ArrayMapState *amstate)

ArrayBuildState * initArrayResultWithSize(Oid element_type, MemoryContext rcontext, bool subcontext, int initsize)

struct ArrayBuildStateArr ArrayBuildStateArr

void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)

void deconstruct_array_builtin(ArrayType *array, Oid elmtype, Datum **elemsp, bool **nullsp, int *nelemsp)

void deconstruct_expanded_array(ExpandedArrayHeader *eah)

ArrayType * construct_md_array(Datum *elems, bool *nulls, int ndims, int *dims, int *lbs, Oid elmtype, int elmlen, bool elmbyval, char elmalign)

ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)

ExpandedArrayHeader * DatumGetExpandedArray(Datum d)

ArrayType * construct_array_builtin(Datum *elems, int nelems, Oid elmtype)

Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)

struct ArrayType ArrayType

AnyArrayType * DatumGetAnyArrayP(Datum d)

void array_bitmap_copy(bits8 *destbitmap, int destoffset, const bits8 *srcbitmap, int srcoffset, int nitems)

struct ArrayBuildState ArrayBuildState

Datum array_get_element(Datum arraydatum, int nSubscripts, int *indx, int arraytyplen, int elmlen, bool elmbyval, char elmalign, bool *isNull)

Datum array_get_slice(Datum arraydatum, int nSubscripts, int *upperIndx, int *lowerIndx, bool *upperProvided, bool *lowerProvided, int arraytyplen, int elmlen, bool elmbyval, char elmalign)

Datum array_set_slice(Datum arraydatum, int nSubscripts, int *upperIndx, int *lowerIndx, bool *upperProvided, bool *lowerProvided, Datum srcArrayDatum, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)

union AnyArrayType AnyArrayType

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

static Datum values[MAXATTR]

static struct cvec * range(struct vars *v, chr a, chr b, int cases)

ArrayBuildStateArr * arraystate

ArrayBuildState * scalarstate