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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

23

24

25

26

27

28

29

30

31int

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

33{

34 int i,

36 offset = 0;

37

38 for (i = n - 1; i >= 0; i--)

39 {

40 offset += (indx[i] - lb[i]) * scale;

42 }

43 return offset;

44}

45

46

47

48

49

50

51

52

53

54

55

56int

58{

60}

61

62

63

64

65

66int

68{

70 int i;

71

72 if (ndim <= 0)

73 return 0;

74 ret = 1;

75 for (i = 0; i < ndim; i++)

76 {

78

79

80 if (dims[i] < 0)

82 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

83 errmsg("array size exceeds the maximum allowed (%d)",

85

87

88 ret = (int32) prod;

89 if ((int64) ret != prod)

91 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

92 errmsg("array size exceeds the maximum allowed (%d)",

94 }

98 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

99 errmsg("array size exceeds the maximum allowed (%d)",

101 return (int) ret;

102}

103

104

105

106

107

108

109

110

111

112

113

114

115

116void

118{

120}

121

122

123

124

125

126bool

128 struct Node *escontext)

129{

130 int i;

131

132 for (i = 0; i < ndim; i++)

133 {

134

136

138 ereturn(escontext, false,

139 (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),

140 errmsg("array lower bound is too large: %d",

141 lb[i])));

142 }

143

144 return true;

145}

146

147

148

149

150

151

152void

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

154{

155 int i;

156

157 for (i = 0; i < n; i++)

158 span[i] = endp[i] - st[i] + 1;

159}

160

161

162

163

164

165

166void

168{

169 int i;

170

171 prod[n - 1] = 1;

172 for (i = n - 2; i >= 0; i--)

173 prod[i] = prod[i + 1] * range[i + 1];

174}

175

176

177

178

179

180

181

182void

184{

185 int i,

186 j;

187

188 dist[n - 1] = 0;

189 for (j = n - 2; j >= 0; j--)

190 {

191 dist[j] = prod[j] - 1;

192 for (i = j + 1; i < n; i++)

193 dist[j] -= (span[i] - 1) * prod[i];

194 }

195}

196

197

198

199

200

201

202

203

204

205

206

207int

209{

210 int i;

211

212 if (n <= 0)

213 return -1;

214

215 curr[n - 1] = (curr[n - 1] + 1) % span[n - 1];

216 for (i = n - 1; i && curr[i] == 0; i--)

217 curr[i - 1] = (curr[i - 1] + 1) % span[i - 1];

218

219 if (i)

220 return i;

221 if (curr[0])

222 return 0;

223

224 return -1;

225}

226

227

228

229

230

231

234{

236 Datum *elem_values;

237 int i;

238

241 (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),

242 errmsg("typmod array must be type cstring[]")));

243

246 (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),

247 errmsg("typmod array must be one-dimensional")));

248

251 (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),

252 errmsg("typmod array must not contain nulls")));

253

255

257

258 for (i = 0; i < *n; i++)

260

261 pfree(elem_values);

262

263 return result;

264}

bool array_contains_nulls(ArrayType *array)

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

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)

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

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

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

int ArrayGetNItems(int ndim, const int *dims)

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

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

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

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

#define PG_USED_FOR_ASSERTS_ONLY

int errcode(int sqlerrcode)

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

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

#define ereport(elevel,...)

Assert(PointerIsAligned(start, uint64))

static bool pg_add_s32_overflow(int32 a, int32 b, int32 *result)

void pfree(void *pointer)

int32 pg_strtoint32(const char *s)

static char * DatumGetCString(Datum X)

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