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