|
26 | 26 | #include"tcop/utility.h" |
27 | 27 |
|
28 | 28 | #include"utils/array.h" |
29 | | -#include"utils/tqual.h" |
30 | 29 | #include"utils/datum.h" |
31 | 30 | #ifPG_VERSION_NUM>=120000 |
| 31 | +#include"access/heapam.h" |
32 | 32 | #include"utils/float.h" |
| 33 | +#else |
| 34 | +#include"utils/tqual.h" |
33 | 35 | #endif |
34 | 36 | #include"utils/builtins.h" |
35 | 37 | #include"utils/datetime.h" |
@@ -1137,9 +1139,10 @@ UserTableUpdateOpenIndexes() |
1137 | 1139 | if (estate->es_result_relation_info->ri_NumIndices>0) |
1138 | 1140 | { |
1139 | 1141 | recheckIndexes=ExecInsertIndexTuples(slot, |
| 1142 | +#ifPG_VERSION_NUM<120000 |
1140 | 1143 | &tuple->t_self, |
| 1144 | +#endif |
1141 | 1145 | estate, false,NULL,NIL); |
1142 | | - |
1143 | 1146 | if (recheckIndexes!=NIL) |
1144 | 1147 | ereport(ERROR, |
1145 | 1148 | (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), |
@@ -1182,7 +1185,7 @@ static void insert_tuple(Datum* values, bool* nulls) |
1182 | 1185 | HeapTupletup=heap_form_tuple(RelationGetDescr(rel),values,nulls); |
1183 | 1186 | #ifPG_VERSION_NUM>=120000 |
1184 | 1187 | ExecStoreHeapTuple(tup,slot, true); |
1185 | | -simple_heap_insert(rel,ExecFetchSlotHeapTuple(slot, true,NULL)); |
| 1188 | +simple_table_insert(rel,slot); |
1186 | 1189 | #else |
1187 | 1190 | ExecStoreTuple(tup,slot,InvalidBuffer, true); |
1188 | 1191 | simple_heap_insert(rel,slot->tts_tuple); |
@@ -2224,6 +2227,7 @@ Datum vops_populate(PG_FUNCTION_ARGS) |
2224 | 2227 | intrc; |
2225 | 2228 | boolis_null; |
2226 | 2229 | int64loaded; |
| 2230 | +booltype_checked= false; |
2227 | 2231 | staticOidself_oid=InvalidOid; |
2228 | 2232 | charstmt[MAX_SQL_STMT_LEN]; |
2229 | 2233 |
|
@@ -2257,6 +2261,7 @@ Datum vops_populate(PG_FUNCTION_ARGS) |
2257 | 2261 | HeapTuplespi_tuple=SPI_tuptable->vals[i]; |
2258 | 2262 | charconst*name=SPI_getvalue(spi_tuple,spi_tupdesc,1); |
2259 | 2263 | Oidtype_id=DatumGetObjectId(SPI_getbinval(spi_tuple,spi_tupdesc,2,&is_null)); |
| 2264 | +types[i].dst_type=type_id; |
2260 | 2265 | types[i].tid=vops_get_type(type_id); |
2261 | 2266 | get_typlenbyvalalign(type_id,&types[i].len,&types[i].byval,&types[i].align); |
2262 | 2267 | if (types[i].tid!=VOPS_LAST&&types[i].len<0) {/* varying length type: extract size from atttypmod */ |
@@ -2294,6 +2299,26 @@ Datum vops_populate(PG_FUNCTION_ARGS) |
2294 | 2299 | if (SPI_processed) { |
2295 | 2300 | HeapTuplespi_tuple=SPI_tuptable->vals[0]; |
2296 | 2301 | spi_tupdesc=SPI_tuptable->tupdesc; |
| 2302 | +if (!type_checked) |
| 2303 | +{ |
| 2304 | +for (i=0;i<n_attrs;i++) |
| 2305 | +{ |
| 2306 | +Oiddst_type=types[i].dst_type; |
| 2307 | +Oidsrc_type=SPI_gettypeid(spi_tupdesc,i+1); |
| 2308 | +types[i].src_type=src_type; |
| 2309 | +if (types[i].tid!=VOPS_LAST) |
| 2310 | +dst_type=vops_map_tid[types[i].tid]; |
| 2311 | +if (!(dst_type==src_type|| |
| 2312 | + (dst_type==CHAROID&&src_type==TEXTOID)|| |
| 2313 | + (dst_type==TEXTOID&&src_type==VARCHAROID)|| |
| 2314 | + (dst_type==TEXTOID&&src_type==BPCHAROID))) |
| 2315 | +{ |
| 2316 | +elog(ERROR,"Incompatible type of attribute %d: %s vs. %s", |
| 2317 | +i+1,format_type_be(dst_type),format_type_be(src_type)); |
| 2318 | +} |
| 2319 | +} |
| 2320 | +type_checked= true; |
| 2321 | +} |
2297 | 2322 | if (j==TILE_SIZE) { |
2298 | 2323 | for (i=0;i<n_attrs;i++) { |
2299 | 2324 | if (types[i].tid!=VOPS_LAST) { |
@@ -2343,7 +2368,7 @@ Datum vops_populate(PG_FUNCTION_ARGS) |
2343 | 2368 | ((vops_bool*)tile)->payload |= (uint64)DatumGetBool(val) <<j; |
2344 | 2369 | break; |
2345 | 2370 | caseVOPS_CHAR: |
2346 | | -((vops_char*)tile)->payload[j]=SPI_gettypeid(spi_tupdesc,i+1)==CHAROID |
| 2371 | +((vops_char*)tile)->payload[j]=types[i].src_type==CHAROID |
2347 | 2372 | ?DatumGetChar(val) |
2348 | 2373 | :*VARDATA(DatumGetTextP(val)); |
2349 | 2374 | break; |
|