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