64{
65 char gboxmem[GIDX_MAX_SIZE];
66 GIDX *gidx_geom, *gidx_key;
67 int dims_geom, dims_key, i;
68
69 Assert(max_dims <= GIDX_MAX_DIM);
70
71
72
73
74
75 if (isnull)
76 {
77 if (column->bv_hasnulls)
78 PG_RETURN_BOOL(false);
79
80 column->bv_hasnulls = true;
81 PG_RETURN_BOOL(true);
82 }
83
84
85
86
87
88 if (!column->bv_allnulls &&
90 PG_RETURN_BOOL(false);
91
92
93 gidx_geom = (GIDX *) gboxmem;
94
95
96
97
98 if (gserialized_datum_get_gidx_p(newval, gidx_geom) ==
LW_FAILURE)
99 {
100
101
102
103
104
106 {
108 {
110 PG_RETURN_BOOL(true);
111 }
112
113 PG_RETURN_BOOL(false);
114 } else
115 {
116
117
118
119
120 elog(ERROR, "Error while extracting the gidx from the geom");
121 }
122 }
123
124
125 dims_geom = GIDX_NDIMS(gidx_geom);
126
127
128 if (column->bv_allnulls)
129 {
130
131
132
133
134
135
136
137 if (dims_geom > max_dims)
138 {
139
140
141
142
143 SET_VARSIZE(gidx_geom, VARHDRSZ + max_dims * 2 * sizeof(float));
144 dims_geom = max_dims;
145 }
146
147 column->bv_values[
INCLUSION_UNION] = datumCopy((Datum) gidx_geom,
false,
148 GIDX_SIZE(dims_geom));
151 column->bv_allnulls = false;
152 PG_RETURN_BOOL(true);
153 }
154
156 dims_key = GIDX_NDIMS(gidx_key);
157
158
159
160
161
162 if (dims_key != dims_geom)
163 {
165 PG_RETURN_BOOL(true);
166 }
167
168
170 PG_RETURN_BOOL(false);
171
172
173
174
175
176
177 for ( i = 0; i < dims_key; i++ )
178 {
179
180 GIDX_SET_MIN(gidx_key, i,
181 Min(GIDX_GET_MIN(gidx_key,i),GIDX_GET_MIN(gidx_geom,i)));
182
183 GIDX_SET_MAX(gidx_key, i,
184 Max(GIDX_GET_MAX(gidx_key,i),GIDX_GET_MAX(gidx_geom,i)));
185 }
186
187 PG_RETURN_BOOL(true);
188}
bool is_gserialized_from_datum_empty(Datum the_datum)
bool gidx_contains(GIDX *a, GIDX *b)
#define INCLUSION_UNMERGEABLE
#define INCLUSION_CONTAINS_EMPTY