diff --git a/expected/13.15/extra/returning.out b/expected/13.15/extra/returning.out index 3621b861..6f7f74f9 100644 --- a/expected/13.15/extra/returning.out +++ b/expected/13.15/extra/returning.out @@ -31,16 +31,17 @@ UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; --Testcase 07: UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."type_STRING" SET `col` = ('_' || substr(`col`, 2)) RETURNING `col` + col +----- +(0 rows) + --Testcase 08: SELECT * FROM "type_STRING"; col -------- - string - TYPE - type + _tring + _YPE + _ype (3 rows) --Testcase 09: @@ -56,9 +57,10 @@ DELETE FROM "type_STRING" RETURNING *; --Testcase 10: DELETE FROM "type_STRING" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_STRING" RETURNING `col` + col +----- +(0 rows) + --Testcase 11: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO "type_STRING"(col) VALUES ('string') ON CONFLICT DO NOTHING RETURNING *; @@ -99,9 +101,10 @@ DELETE FROM "type_BYTE" RETURNING *; --Testcase 15: DELETE FROM "type_BYTE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BYTE" RETURNING `col` + col +----- +(0 rows) + --Testcase 16: SELECT * FROM "type_SINT"; col @@ -112,9 +115,10 @@ SELECT * FROM "type_SINT"; --Testcase 17: DELETE FROM "type_SINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_SINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 18: SELECT * FROM "type_BINT"; col @@ -125,9 +129,10 @@ SELECT * FROM "type_BINT"; --Testcase 19: DELETE FROM "type_BINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 20: SELECT * FROM "type_INTEGER"; col @@ -137,9 +142,10 @@ SELECT * FROM "type_INTEGER"; --Testcase 21: DELETE FROM "type_INTEGER" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_INTEGER" RETURNING `col` + col +----- +(0 rows) + --Testcase 22: SELECT * FROM "type_FLOAT"; col @@ -149,9 +155,10 @@ SELECT * FROM "type_FLOAT"; --Testcase 23: DELETE FROM "type_FLOAT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_FLOAT" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + --Testcase 24: SELECT * FROM "type_DOUBLE"; col @@ -164,9 +171,10 @@ SELECT * FROM "type_DOUBLE"; --Testcase 25: DELETE FROM "type_DOUBLE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_DOUBLE" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + -- set datestyle=ISO; --Testcase 26: @@ -179,9 +187,10 @@ SELECT * FROM "type_TIMESTAMP"; --Testcase 27: DELETE FROM "type_TIMESTAMP" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TIMESTAMP" RETURNING `col`, `b` + col | b +-----+--- +(0 rows) + --Testcase 28: SELECT * FROM "type_BLOB"; col @@ -191,16 +200,18 @@ SELECT * FROM "type_BLOB"; --Testcase 29: DELETE FROM "type_BLOB" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BLOB" RETURNING `col` + col +----- +(0 rows) + --Testcase 30: ALTER TABLE "type_UUID" ALTER COLUMN "i" OPTIONS (ADD key 'true'); --Testcase 31: DELETE FROM "type_UUID" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_UUID" RETURNING `i`, sqlite_fdw_uuid_blob(`u`) + i | u +---+--- +(0 rows) + --Testcase 32: DELETE FROM "type_BIT" RETURNING *; ERROR: no primary key column specified for foreign table @@ -436,9 +447,10 @@ SELECT * FROM type_JSON; --Testcase 64 DELETE FROM type_JSON RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TEXT" RETURNING `col` + col +----- +(0 rows) + ALTER TABLE typetest ALTER COLUMN i OPTIONS (ADD key 'true'); --Testcase 65: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) @@ -511,11 +523,9 @@ INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020. --Testcase 72: INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING ti c_timestamp; - c_timestamp -------------------------- - 2020-11-05 12:34:56.789 -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (23 bytes) : '2020-11-05 12:34:56.789' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 73: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; @@ -530,11 +540,9 @@ INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2 --Testcase 74: INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; - sst ------ - -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (10 bytes) : 'n ' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 75: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; @@ -548,9 +556,10 @@ UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; --Testcase 76: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 77: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -586,9 +595,10 @@ UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i --Testcase 80: UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 81: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; @@ -602,9 +612,10 @@ UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; --Testcase 82: UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 83: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; @@ -618,9 +629,10 @@ UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 84: UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 85: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=1 RETURNING *; @@ -634,9 +646,10 @@ DELETE FROM typetest WHERE i=1 RETURNING *; --Testcase 86: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); DELETE FROM typetest WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 87: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -672,9 +685,10 @@ DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, --Testcase 90: DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 91: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; @@ -688,9 +702,10 @@ DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; --Testcase 92: DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 93: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; @@ -704,9 +719,10 @@ DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 94: DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 95: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (6, 'p', 'q', 'r', '2021.11.06 12:34:56.789', '2021.11.05 12:34:56.789') RETURNING 'ok' t; @@ -740,7 +756,8 @@ UPDATE typetest SET t='upd' WHERE i=6 RETURNING 'ok1'; UPDATE typetest SET t='upd' WHERE i=6 RETURNING 'ok1'; ?column? ---------- -(0 rows) + ok1 +(1 row) --Testcase 98: EXPLAIN (VERBOSE, COSTS OFF) @@ -757,79 +774,347 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; DELETE FROM typetest WHERE i=6 RETURNING 'del'; ?column? ---------- -(0 rows) + del +(1 row) -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ERROR: type "user_enum" does not exist -LINE 10: c8 user_enum - ^ -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; -ERROR: relation "ft2" does not exist -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); -ERROR: server "loopback" does not exist -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); -ERROR: server "loopback" does not exist -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; -ERROR: relation "ft2" does not exist -LINE 1: INSERT INTO ft2 (c1,c2,c3) - ^ +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 101: +SELECT * FROM ret_base; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 103: +SELECT * FROM ret_j1t; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "integer" affinity : 17 +CONTEXT: foreign table "ret_j2t" foreign column "c3" have data type "double precision" (usual affinity "real"), in query there is reference to foreign column +--Testcase 105: +SELECT * FROM ret_j2t; + c1 | c2 | c3 +----+----+---- +(0 rows) + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: UPDATE ft2 SET c3 = 'foo' - ^ -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -ERROR: relation "ft2" does not exist -LINE 1: UPDATE ft2 SET c3 = 'foo' - ^ +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Update on public.ret_base + Output: ret_base.*, ret_base.c1, ret_base.c2, ret_base.c3, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + -> Merge Join + Output: 'foo'::text, ret_base.c1, ret_base.*, ret_j1t.*, ret_j2t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Merge Join + Output: ret_base.c1, ret_base.*, ret_base.c2, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_base.c2 = ret_j1t.c1) + -> Sort + Output: ret_base.c1, ret_base.*, ret_base.c2 + Sort Key: ret_base.c2 + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.*, ret_base.c2 + SQLite query: SELECT `c1`, `c2`, `c3` FROM main."ret_base" WHERE ((`c1` > 1200)) + -> Sort + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Sort Key: ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Sort + Output: ret_j2t.*, ret_j2t.c1 + Sort Key: ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(26 rows) + +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; + ret_base | c1 | c2 | c3 | ret_j1t | c1 | c2 | c3 +----------+----+----+----+---------+----+----+---- +(0 rows) + +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: DELETE FROM ft2 - ^ -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Delete on public.ret_base + Output: 100 + -> Foreign Scan + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + SQLite query: SELECT r1.`c1`, CASE WHEN ( r2.`c1` IS NOT NULL) OR ( r2.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r2.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r2.`c1`, '') || "," || COALESCE(r2.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r2.`c3`), '')|| ")") END, CASE WHEN ( r3.`c1` IS NOT NULL) OR ( r3.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r3.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r3.`c1`, '') || "," || COALESCE(r3.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r3.`c3`), '')|| ")") END FROM ((main."ret_base" r1 INNER JOIN main."ret_j1t" r2 ON (((r1.`c2` = r2.`c1`)) AND ((r1.`c1` > 1200)) AND (((r1.`c1` % 10) = 0)))) LEFT JOIN main."ret_j2t" r3 ON (((r2.`c1` = r3.`c1`)))) + -> Hash Left Join + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + Hash Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Hash Join + Output: ret_base.c1, ret_j1t.*, ret_j1t.c1 + Hash Cond: (ret_base.c2 = ret_j1t.c1) + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.c2, ret_base.c3 + SQLite query: SELECT `c1`, `c2` FROM main."ret_base" WHERE ((`c1` > 1200)) AND (((`c1` % 10) = 0)) + -> Hash + Output: ret_j1t.*, ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Hash + Output: ret_j2t.*, ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(24 rows) + +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 - ^ -DELETE FROM ft2 WHERE ft2.c1 > 1200; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 WHERE ft2.c1 > 1200; - ^ + ?column? +---------- +(0 rows) + +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -880,5 +1165,8 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to server sqlite2 diff --git a/expected/13.15/type.out b/expected/13.15/type.out index 38998846..8fb741b2 100644 --- a/expected/13.15/type.out +++ b/expected/13.15/type.out @@ -579,7 +579,7 @@ SELECT * FROM "type_DOUBLE"; -- OK, +- Inf --Testcase 47: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -629,6 +629,9 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to foreign table "type_BOOLEAN" drop cascades to server sqlite2 diff --git a/expected/14.12/extra/returning.out b/expected/14.12/extra/returning.out index 186fa7bd..6f7f74f9 100644 --- a/expected/14.12/extra/returning.out +++ b/expected/14.12/extra/returning.out @@ -31,16 +31,17 @@ UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; --Testcase 07: UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."type_STRING" SET `col` = ('_' || substr(`col`, 2)) RETURNING `col` + col +----- +(0 rows) + --Testcase 08: SELECT * FROM "type_STRING"; col -------- - string - TYPE - type + _tring + _YPE + _ype (3 rows) --Testcase 09: @@ -56,9 +57,10 @@ DELETE FROM "type_STRING" RETURNING *; --Testcase 10: DELETE FROM "type_STRING" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_STRING" RETURNING `col` + col +----- +(0 rows) + --Testcase 11: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO "type_STRING"(col) VALUES ('string') ON CONFLICT DO NOTHING RETURNING *; @@ -99,9 +101,10 @@ DELETE FROM "type_BYTE" RETURNING *; --Testcase 15: DELETE FROM "type_BYTE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BYTE" RETURNING `col` + col +----- +(0 rows) + --Testcase 16: SELECT * FROM "type_SINT"; col @@ -112,9 +115,10 @@ SELECT * FROM "type_SINT"; --Testcase 17: DELETE FROM "type_SINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_SINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 18: SELECT * FROM "type_BINT"; col @@ -125,9 +129,10 @@ SELECT * FROM "type_BINT"; --Testcase 19: DELETE FROM "type_BINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 20: SELECT * FROM "type_INTEGER"; col @@ -137,9 +142,10 @@ SELECT * FROM "type_INTEGER"; --Testcase 21: DELETE FROM "type_INTEGER" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_INTEGER" RETURNING `col` + col +----- +(0 rows) + --Testcase 22: SELECT * FROM "type_FLOAT"; col @@ -149,9 +155,10 @@ SELECT * FROM "type_FLOAT"; --Testcase 23: DELETE FROM "type_FLOAT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_FLOAT" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + --Testcase 24: SELECT * FROM "type_DOUBLE"; col @@ -164,9 +171,10 @@ SELECT * FROM "type_DOUBLE"; --Testcase 25: DELETE FROM "type_DOUBLE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_DOUBLE" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + -- set datestyle=ISO; --Testcase 26: @@ -179,9 +187,10 @@ SELECT * FROM "type_TIMESTAMP"; --Testcase 27: DELETE FROM "type_TIMESTAMP" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TIMESTAMP" RETURNING `col`, `b` + col | b +-----+--- +(0 rows) + --Testcase 28: SELECT * FROM "type_BLOB"; col @@ -191,16 +200,18 @@ SELECT * FROM "type_BLOB"; --Testcase 29: DELETE FROM "type_BLOB" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BLOB" RETURNING `col` + col +----- +(0 rows) + --Testcase 30: ALTER TABLE "type_UUID" ALTER COLUMN "i" OPTIONS (ADD key 'true'); --Testcase 31: DELETE FROM "type_UUID" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_UUID" RETURNING `i`, sqlite_fdw_uuid_blob(`u`) + i | u +---+--- +(0 rows) + --Testcase 32: DELETE FROM "type_BIT" RETURNING *; ERROR: no primary key column specified for foreign table @@ -436,9 +447,10 @@ SELECT * FROM type_JSON; --Testcase 64 DELETE FROM type_JSON RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TEXT" RETURNING `col` + col +----- +(0 rows) + ALTER TABLE typetest ALTER COLUMN i OPTIONS (ADD key 'true'); --Testcase 65: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) @@ -511,11 +523,9 @@ INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020. --Testcase 72: INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING ti c_timestamp; - c_timestamp -------------------------- - 2020-11-05 12:34:56.789 -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (23 bytes) : '2020-11-05 12:34:56.789' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 73: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; @@ -530,11 +540,9 @@ INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2 --Testcase 74: INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; - sst ------ - -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (10 bytes) : 'n ' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 75: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; @@ -548,9 +556,10 @@ UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; --Testcase 76: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 77: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -586,9 +595,10 @@ UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i --Testcase 80: UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 81: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; @@ -602,9 +612,10 @@ UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; --Testcase 82: UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 83: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; @@ -618,9 +629,10 @@ UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 84: UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 85: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=1 RETURNING *; @@ -634,9 +646,10 @@ DELETE FROM typetest WHERE i=1 RETURNING *; --Testcase 86: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); DELETE FROM typetest WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 87: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -672,9 +685,10 @@ DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, --Testcase 90: DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 91: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; @@ -688,9 +702,10 @@ DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; --Testcase 92: DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 93: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; @@ -704,9 +719,10 @@ DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 94: DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 95: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (6, 'p', 'q', 'r', '2021.11.06 12:34:56.789', '2021.11.05 12:34:56.789') RETURNING 'ok' t; @@ -761,77 +777,344 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; del (1 row) -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ERROR: type "user_enum" does not exist -LINE 10: c8 user_enum - ^ -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; -ERROR: relation "ft2" does not exist -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); -ERROR: server "loopback" does not exist -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); -ERROR: server "loopback" does not exist -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; -ERROR: relation "ft2" does not exist -LINE 1: INSERT INTO ft2 (c1,c2,c3) - ^ +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 101: +SELECT * FROM ret_base; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 103: +SELECT * FROM ret_j1t; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "integer" affinity : 17 +CONTEXT: foreign table "ret_j2t" foreign column "c3" have data type "double precision" (usual affinity "real"), in query there is reference to foreign column +--Testcase 105: +SELECT * FROM ret_j2t; + c1 | c2 | c3 +----+----+---- +(0 rows) + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: UPDATE ft2 SET c3 = 'foo' - ^ -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -ERROR: relation "ft2" does not exist -LINE 1: UPDATE ft2 SET c3 = 'foo' - ^ +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Update on public.ret_base + Output: ret_base.*, ret_base.c1, ret_base.c2, ret_base.c3, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + -> Merge Join + Output: 'foo'::text, ret_base.c1, ret_base.*, ret_j1t.*, ret_j2t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Merge Join + Output: ret_base.c1, ret_base.*, ret_base.c2, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_base.c2 = ret_j1t.c1) + -> Sort + Output: ret_base.c1, ret_base.*, ret_base.c2 + Sort Key: ret_base.c2 + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.*, ret_base.c2 + SQLite query: SELECT `c1`, `c2`, `c3` FROM main."ret_base" WHERE ((`c1` > 1200)) + -> Sort + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Sort Key: ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Sort + Output: ret_j2t.*, ret_j2t.c1 + Sort Key: ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(26 rows) + +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; + ret_base | c1 | c2 | c3 | ret_j1t | c1 | c2 | c3 +----------+----+----+----+---------+----+----+---- +(0 rows) + +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: DELETE FROM ft2 - ^ -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Delete on public.ret_base + Output: 100 + -> Foreign Scan + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + SQLite query: SELECT r1.`c1`, CASE WHEN ( r2.`c1` IS NOT NULL) OR ( r2.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r2.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r2.`c1`, '') || "," || COALESCE(r2.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r2.`c3`), '')|| ")") END, CASE WHEN ( r3.`c1` IS NOT NULL) OR ( r3.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r3.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r3.`c1`, '') || "," || COALESCE(r3.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r3.`c3`), '')|| ")") END FROM ((main."ret_base" r1 INNER JOIN main."ret_j1t" r2 ON (((r1.`c2` = r2.`c1`)) AND ((r1.`c1` > 1200)) AND (((r1.`c1` % 10) = 0)))) LEFT JOIN main."ret_j2t" r3 ON (((r2.`c1` = r3.`c1`)))) + -> Hash Left Join + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + Hash Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Hash Join + Output: ret_base.c1, ret_j1t.*, ret_j1t.c1 + Hash Cond: (ret_base.c2 = ret_j1t.c1) + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.c2, ret_base.c3 + SQLite query: SELECT `c1`, `c2` FROM main."ret_base" WHERE ((`c1` > 1200)) AND (((`c1` % 10) = 0)) + -> Hash + Output: ret_j1t.*, ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Hash + Output: ret_j2t.*, ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(24 rows) + +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 - ^ -DELETE FROM ft2 WHERE ft2.c1 > 1200; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 WHERE ft2.c1 > 1200; - ^ + ?column? +---------- +(0 rows) + +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -882,5 +1165,8 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to server sqlite2 diff --git a/expected/14.12/type.out b/expected/14.12/type.out index 38998846..8fb741b2 100644 --- a/expected/14.12/type.out +++ b/expected/14.12/type.out @@ -579,7 +579,7 @@ SELECT * FROM "type_DOUBLE"; -- OK, +- Inf --Testcase 47: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -629,6 +629,9 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to foreign table "type_BOOLEAN" drop cascades to server sqlite2 diff --git a/expected/15.7/extra/returning.out b/expected/15.7/extra/returning.out index 186fa7bd..6f7f74f9 100644 --- a/expected/15.7/extra/returning.out +++ b/expected/15.7/extra/returning.out @@ -31,16 +31,17 @@ UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; --Testcase 07: UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."type_STRING" SET `col` = ('_' || substr(`col`, 2)) RETURNING `col` + col +----- +(0 rows) + --Testcase 08: SELECT * FROM "type_STRING"; col -------- - string - TYPE - type + _tring + _YPE + _ype (3 rows) --Testcase 09: @@ -56,9 +57,10 @@ DELETE FROM "type_STRING" RETURNING *; --Testcase 10: DELETE FROM "type_STRING" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_STRING" RETURNING `col` + col +----- +(0 rows) + --Testcase 11: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO "type_STRING"(col) VALUES ('string') ON CONFLICT DO NOTHING RETURNING *; @@ -99,9 +101,10 @@ DELETE FROM "type_BYTE" RETURNING *; --Testcase 15: DELETE FROM "type_BYTE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BYTE" RETURNING `col` + col +----- +(0 rows) + --Testcase 16: SELECT * FROM "type_SINT"; col @@ -112,9 +115,10 @@ SELECT * FROM "type_SINT"; --Testcase 17: DELETE FROM "type_SINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_SINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 18: SELECT * FROM "type_BINT"; col @@ -125,9 +129,10 @@ SELECT * FROM "type_BINT"; --Testcase 19: DELETE FROM "type_BINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 20: SELECT * FROM "type_INTEGER"; col @@ -137,9 +142,10 @@ SELECT * FROM "type_INTEGER"; --Testcase 21: DELETE FROM "type_INTEGER" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_INTEGER" RETURNING `col` + col +----- +(0 rows) + --Testcase 22: SELECT * FROM "type_FLOAT"; col @@ -149,9 +155,10 @@ SELECT * FROM "type_FLOAT"; --Testcase 23: DELETE FROM "type_FLOAT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_FLOAT" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + --Testcase 24: SELECT * FROM "type_DOUBLE"; col @@ -164,9 +171,10 @@ SELECT * FROM "type_DOUBLE"; --Testcase 25: DELETE FROM "type_DOUBLE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_DOUBLE" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + -- set datestyle=ISO; --Testcase 26: @@ -179,9 +187,10 @@ SELECT * FROM "type_TIMESTAMP"; --Testcase 27: DELETE FROM "type_TIMESTAMP" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TIMESTAMP" RETURNING `col`, `b` + col | b +-----+--- +(0 rows) + --Testcase 28: SELECT * FROM "type_BLOB"; col @@ -191,16 +200,18 @@ SELECT * FROM "type_BLOB"; --Testcase 29: DELETE FROM "type_BLOB" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BLOB" RETURNING `col` + col +----- +(0 rows) + --Testcase 30: ALTER TABLE "type_UUID" ALTER COLUMN "i" OPTIONS (ADD key 'true'); --Testcase 31: DELETE FROM "type_UUID" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_UUID" RETURNING `i`, sqlite_fdw_uuid_blob(`u`) + i | u +---+--- +(0 rows) + --Testcase 32: DELETE FROM "type_BIT" RETURNING *; ERROR: no primary key column specified for foreign table @@ -436,9 +447,10 @@ SELECT * FROM type_JSON; --Testcase 64 DELETE FROM type_JSON RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TEXT" RETURNING `col` + col +----- +(0 rows) + ALTER TABLE typetest ALTER COLUMN i OPTIONS (ADD key 'true'); --Testcase 65: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) @@ -511,11 +523,9 @@ INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020. --Testcase 72: INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING ti c_timestamp; - c_timestamp -------------------------- - 2020-11-05 12:34:56.789 -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (23 bytes) : '2020-11-05 12:34:56.789' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 73: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; @@ -530,11 +540,9 @@ INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2 --Testcase 74: INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; - sst ------ - -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (10 bytes) : 'n ' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 75: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; @@ -548,9 +556,10 @@ UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; --Testcase 76: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 77: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -586,9 +595,10 @@ UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i --Testcase 80: UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 81: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; @@ -602,9 +612,10 @@ UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; --Testcase 82: UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 83: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; @@ -618,9 +629,10 @@ UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 84: UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 85: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=1 RETURNING *; @@ -634,9 +646,10 @@ DELETE FROM typetest WHERE i=1 RETURNING *; --Testcase 86: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); DELETE FROM typetest WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 87: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -672,9 +685,10 @@ DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, --Testcase 90: DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 91: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; @@ -688,9 +702,10 @@ DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; --Testcase 92: DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 93: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; @@ -704,9 +719,10 @@ DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 94: DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 95: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (6, 'p', 'q', 'r', '2021.11.06 12:34:56.789', '2021.11.05 12:34:56.789') RETURNING 'ok' t; @@ -761,77 +777,344 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; del (1 row) -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ERROR: type "user_enum" does not exist -LINE 10: c8 user_enum - ^ -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; -ERROR: relation "ft2" does not exist -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); -ERROR: server "loopback" does not exist -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); -ERROR: server "loopback" does not exist -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; -ERROR: relation "ft2" does not exist -LINE 1: INSERT INTO ft2 (c1,c2,c3) - ^ +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 101: +SELECT * FROM ret_base; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 103: +SELECT * FROM ret_j1t; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "integer" affinity : 17 +CONTEXT: foreign table "ret_j2t" foreign column "c3" have data type "double precision" (usual affinity "real"), in query there is reference to foreign column +--Testcase 105: +SELECT * FROM ret_j2t; + c1 | c2 | c3 +----+----+---- +(0 rows) + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: UPDATE ft2 SET c3 = 'foo' - ^ -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -ERROR: relation "ft2" does not exist -LINE 1: UPDATE ft2 SET c3 = 'foo' - ^ +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Update on public.ret_base + Output: ret_base.*, ret_base.c1, ret_base.c2, ret_base.c3, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + -> Merge Join + Output: 'foo'::text, ret_base.c1, ret_base.*, ret_j1t.*, ret_j2t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Merge Join + Output: ret_base.c1, ret_base.*, ret_base.c2, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_base.c2 = ret_j1t.c1) + -> Sort + Output: ret_base.c1, ret_base.*, ret_base.c2 + Sort Key: ret_base.c2 + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.*, ret_base.c2 + SQLite query: SELECT `c1`, `c2`, `c3` FROM main."ret_base" WHERE ((`c1` > 1200)) + -> Sort + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Sort Key: ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Sort + Output: ret_j2t.*, ret_j2t.c1 + Sort Key: ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(26 rows) + +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; + ret_base | c1 | c2 | c3 | ret_j1t | c1 | c2 | c3 +----------+----+----+----+---------+----+----+---- +(0 rows) + +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: DELETE FROM ft2 - ^ -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Delete on public.ret_base + Output: 100 + -> Foreign Scan + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + SQLite query: SELECT r1.`c1`, CASE WHEN ( r2.`c1` IS NOT NULL) OR ( r2.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r2.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r2.`c1`, '') || "," || COALESCE(r2.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r2.`c3`), '')|| ")") END, CASE WHEN ( r3.`c1` IS NOT NULL) OR ( r3.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r3.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r3.`c1`, '') || "," || COALESCE(r3.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r3.`c3`), '')|| ")") END FROM ((main."ret_base" r1 INNER JOIN main."ret_j1t" r2 ON (((r1.`c2` = r2.`c1`)) AND ((r1.`c1` > 1200)) AND (((r1.`c1` % 10) = 0)))) LEFT JOIN main."ret_j2t" r3 ON (((r2.`c1` = r3.`c1`)))) + -> Hash Left Join + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + Hash Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Hash Join + Output: ret_base.c1, ret_j1t.*, ret_j1t.c1 + Hash Cond: (ret_base.c2 = ret_j1t.c1) + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.c2, ret_base.c3 + SQLite query: SELECT `c1`, `c2` FROM main."ret_base" WHERE ((`c1` > 1200)) AND (((`c1` % 10) = 0)) + -> Hash + Output: ret_j1t.*, ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Hash + Output: ret_j2t.*, ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(24 rows) + +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 - ^ -DELETE FROM ft2 WHERE ft2.c1 > 1200; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 WHERE ft2.c1 > 1200; - ^ + ?column? +---------- +(0 rows) + +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -882,5 +1165,8 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to server sqlite2 diff --git a/expected/15.7/type.out b/expected/15.7/type.out index 38998846..8fb741b2 100644 --- a/expected/15.7/type.out +++ b/expected/15.7/type.out @@ -579,7 +579,7 @@ SELECT * FROM "type_DOUBLE"; -- OK, +- Inf --Testcase 47: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -629,6 +629,9 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to foreign table "type_BOOLEAN" drop cascades to server sqlite2 diff --git a/expected/16.3/extra/returning.out b/expected/16.3/extra/returning.out index 186fa7bd..6f7f74f9 100644 --- a/expected/16.3/extra/returning.out +++ b/expected/16.3/extra/returning.out @@ -31,16 +31,17 @@ UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; --Testcase 07: UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."type_STRING" SET `col` = ('_' || substr(`col`, 2)) RETURNING `col` + col +----- +(0 rows) + --Testcase 08: SELECT * FROM "type_STRING"; col -------- - string - TYPE - type + _tring + _YPE + _ype (3 rows) --Testcase 09: @@ -56,9 +57,10 @@ DELETE FROM "type_STRING" RETURNING *; --Testcase 10: DELETE FROM "type_STRING" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_STRING" RETURNING `col` + col +----- +(0 rows) + --Testcase 11: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO "type_STRING"(col) VALUES ('string') ON CONFLICT DO NOTHING RETURNING *; @@ -99,9 +101,10 @@ DELETE FROM "type_BYTE" RETURNING *; --Testcase 15: DELETE FROM "type_BYTE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BYTE" RETURNING `col` + col +----- +(0 rows) + --Testcase 16: SELECT * FROM "type_SINT"; col @@ -112,9 +115,10 @@ SELECT * FROM "type_SINT"; --Testcase 17: DELETE FROM "type_SINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_SINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 18: SELECT * FROM "type_BINT"; col @@ -125,9 +129,10 @@ SELECT * FROM "type_BINT"; --Testcase 19: DELETE FROM "type_BINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 20: SELECT * FROM "type_INTEGER"; col @@ -137,9 +142,10 @@ SELECT * FROM "type_INTEGER"; --Testcase 21: DELETE FROM "type_INTEGER" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_INTEGER" RETURNING `col` + col +----- +(0 rows) + --Testcase 22: SELECT * FROM "type_FLOAT"; col @@ -149,9 +155,10 @@ SELECT * FROM "type_FLOAT"; --Testcase 23: DELETE FROM "type_FLOAT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_FLOAT" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + --Testcase 24: SELECT * FROM "type_DOUBLE"; col @@ -164,9 +171,10 @@ SELECT * FROM "type_DOUBLE"; --Testcase 25: DELETE FROM "type_DOUBLE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_DOUBLE" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + -- set datestyle=ISO; --Testcase 26: @@ -179,9 +187,10 @@ SELECT * FROM "type_TIMESTAMP"; --Testcase 27: DELETE FROM "type_TIMESTAMP" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TIMESTAMP" RETURNING `col`, `b` + col | b +-----+--- +(0 rows) + --Testcase 28: SELECT * FROM "type_BLOB"; col @@ -191,16 +200,18 @@ SELECT * FROM "type_BLOB"; --Testcase 29: DELETE FROM "type_BLOB" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BLOB" RETURNING `col` + col +----- +(0 rows) + --Testcase 30: ALTER TABLE "type_UUID" ALTER COLUMN "i" OPTIONS (ADD key 'true'); --Testcase 31: DELETE FROM "type_UUID" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_UUID" RETURNING `i`, sqlite_fdw_uuid_blob(`u`) + i | u +---+--- +(0 rows) + --Testcase 32: DELETE FROM "type_BIT" RETURNING *; ERROR: no primary key column specified for foreign table @@ -436,9 +447,10 @@ SELECT * FROM type_JSON; --Testcase 64 DELETE FROM type_JSON RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TEXT" RETURNING `col` + col +----- +(0 rows) + ALTER TABLE typetest ALTER COLUMN i OPTIONS (ADD key 'true'); --Testcase 65: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) @@ -511,11 +523,9 @@ INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020. --Testcase 72: INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING ti c_timestamp; - c_timestamp -------------------------- - 2020-11-05 12:34:56.789 -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (23 bytes) : '2020-11-05 12:34:56.789' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 73: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; @@ -530,11 +540,9 @@ INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2 --Testcase 74: INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; - sst ------ - -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (10 bytes) : 'n ' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 75: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; @@ -548,9 +556,10 @@ UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; --Testcase 76: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 77: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -586,9 +595,10 @@ UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i --Testcase 80: UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 81: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; @@ -602,9 +612,10 @@ UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; --Testcase 82: UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 83: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; @@ -618,9 +629,10 @@ UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 84: UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 85: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=1 RETURNING *; @@ -634,9 +646,10 @@ DELETE FROM typetest WHERE i=1 RETURNING *; --Testcase 86: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); DELETE FROM typetest WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 87: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -672,9 +685,10 @@ DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, --Testcase 90: DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 91: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; @@ -688,9 +702,10 @@ DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; --Testcase 92: DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 93: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; @@ -704,9 +719,10 @@ DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 94: DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 95: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (6, 'p', 'q', 'r', '2021.11.06 12:34:56.789', '2021.11.05 12:34:56.789') RETURNING 'ok' t; @@ -761,77 +777,344 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; del (1 row) -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ERROR: type "user_enum" does not exist -LINE 10: c8 user_enum - ^ -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; -ERROR: relation "ft2" does not exist -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); -ERROR: server "loopback" does not exist -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); -ERROR: server "loopback" does not exist -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; -ERROR: relation "ft2" does not exist -LINE 1: INSERT INTO ft2 (c1,c2,c3) - ^ +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 101: +SELECT * FROM ret_base; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 103: +SELECT * FROM ret_j1t; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "integer" affinity : 17 +CONTEXT: foreign table "ret_j2t" foreign column "c3" have data type "double precision" (usual affinity "real"), in query there is reference to foreign column +--Testcase 105: +SELECT * FROM ret_j2t; + c1 | c2 | c3 +----+----+---- +(0 rows) + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: UPDATE ft2 SET c3 = 'foo' - ^ -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -ERROR: relation "ft2" does not exist -LINE 1: UPDATE ft2 SET c3 = 'foo' - ^ +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Update on public.ret_base + Output: ret_base.*, ret_base.c1, ret_base.c2, ret_base.c3, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + -> Merge Join + Output: 'foo'::text, ret_base.c1, ret_base.*, ret_j1t.*, ret_j2t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Merge Join + Output: ret_base.c1, ret_base.*, ret_base.c2, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_base.c2 = ret_j1t.c1) + -> Sort + Output: ret_base.c1, ret_base.*, ret_base.c2 + Sort Key: ret_base.c2 + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.*, ret_base.c2 + SQLite query: SELECT `c1`, `c2`, `c3` FROM main."ret_base" WHERE ((`c1` > 1200)) + -> Sort + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Sort Key: ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Sort + Output: ret_j2t.*, ret_j2t.c1 + Sort Key: ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(26 rows) + +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; + ret_base | c1 | c2 | c3 | ret_j1t | c1 | c2 | c3 +----------+----+----+----+---------+----+----+---- +(0 rows) + +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: DELETE FROM ft2 - ^ -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Delete on public.ret_base + Output: 100 + -> Foreign Scan + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + SQLite query: SELECT r1.`c1`, CASE WHEN ( r2.`c1` IS NOT NULL) OR ( r2.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r2.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r2.`c1`, '') || "," || COALESCE(r2.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r2.`c3`), '')|| ")") END, CASE WHEN ( r3.`c1` IS NOT NULL) OR ( r3.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r3.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r3.`c1`, '') || "," || COALESCE(r3.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r3.`c3`), '')|| ")") END FROM ((main."ret_base" r1 INNER JOIN main."ret_j1t" r2 ON (((r1.`c2` = r2.`c1`)) AND ((r1.`c1` > 1200)) AND (((r1.`c1` % 10) = 0)))) LEFT JOIN main."ret_j2t" r3 ON (((r2.`c1` = r3.`c1`)))) + -> Hash Left Join + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + Hash Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Hash Join + Output: ret_base.c1, ret_j1t.*, ret_j1t.c1 + Hash Cond: (ret_base.c2 = ret_j1t.c1) + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.c2, ret_base.c3 + SQLite query: SELECT `c1`, `c2` FROM main."ret_base" WHERE ((`c1` > 1200)) AND (((`c1` % 10) = 0)) + -> Hash + Output: ret_j1t.*, ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Hash + Output: ret_j2t.*, ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(24 rows) + +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 - ^ -DELETE FROM ft2 WHERE ft2.c1 > 1200; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 WHERE ft2.c1 > 1200; - ^ + ?column? +---------- +(0 rows) + +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -882,5 +1165,8 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to server sqlite2 diff --git a/expected/16.3/type.out b/expected/16.3/type.out index 38998846..8fb741b2 100644 --- a/expected/16.3/type.out +++ b/expected/16.3/type.out @@ -579,7 +579,7 @@ SELECT * FROM "type_DOUBLE"; -- OK, +- Inf --Testcase 47: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -629,6 +629,9 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to foreign table "type_BOOLEAN" drop cascades to server sqlite2 diff --git a/expected/17.0/extra/returning.out b/expected/17.0/extra/returning.out index 186fa7bd..6f7f74f9 100644 --- a/expected/17.0/extra/returning.out +++ b/expected/17.0/extra/returning.out @@ -31,16 +31,17 @@ UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; --Testcase 07: UPDATE "type_STRING" SET col = '_' || substr(col, 2) RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."type_STRING" SET `col` = ('_' || substr(`col`, 2)) RETURNING `col` + col +----- +(0 rows) + --Testcase 08: SELECT * FROM "type_STRING"; col -------- - string - TYPE - type + _tring + _YPE + _ype (3 rows) --Testcase 09: @@ -56,9 +57,10 @@ DELETE FROM "type_STRING" RETURNING *; --Testcase 10: DELETE FROM "type_STRING" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_STRING" RETURNING `col` + col +----- +(0 rows) + --Testcase 11: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO "type_STRING"(col) VALUES ('string') ON CONFLICT DO NOTHING RETURNING *; @@ -99,9 +101,10 @@ DELETE FROM "type_BYTE" RETURNING *; --Testcase 15: DELETE FROM "type_BYTE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BYTE" RETURNING `col` + col +----- +(0 rows) + --Testcase 16: SELECT * FROM "type_SINT"; col @@ -112,9 +115,10 @@ SELECT * FROM "type_SINT"; --Testcase 17: DELETE FROM "type_SINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_SINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 18: SELECT * FROM "type_BINT"; col @@ -125,9 +129,10 @@ SELECT * FROM "type_BINT"; --Testcase 19: DELETE FROM "type_BINT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BINT" RETURNING `col` + col +----- +(0 rows) + --Testcase 20: SELECT * FROM "type_INTEGER"; col @@ -137,9 +142,10 @@ SELECT * FROM "type_INTEGER"; --Testcase 21: DELETE FROM "type_INTEGER" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_INTEGER" RETURNING `col` + col +----- +(0 rows) + --Testcase 22: SELECT * FROM "type_FLOAT"; col @@ -149,9 +155,10 @@ SELECT * FROM "type_FLOAT"; --Testcase 23: DELETE FROM "type_FLOAT" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_FLOAT" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + --Testcase 24: SELECT * FROM "type_DOUBLE"; col @@ -164,9 +171,10 @@ SELECT * FROM "type_DOUBLE"; --Testcase 25: DELETE FROM "type_DOUBLE" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_DOUBLE" RETURNING sqlite_fdw_float(`col`) + col +----- +(0 rows) + -- set datestyle=ISO; --Testcase 26: @@ -179,9 +187,10 @@ SELECT * FROM "type_TIMESTAMP"; --Testcase 27: DELETE FROM "type_TIMESTAMP" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TIMESTAMP" RETURNING `col`, `b` + col | b +-----+--- +(0 rows) + --Testcase 28: SELECT * FROM "type_BLOB"; col @@ -191,16 +200,18 @@ SELECT * FROM "type_BLOB"; --Testcase 29: DELETE FROM "type_BLOB" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_BLOB" RETURNING `col` + col +----- +(0 rows) + --Testcase 30: ALTER TABLE "type_UUID" ALTER COLUMN "i" OPTIONS (ADD key 'true'); --Testcase 31: DELETE FROM "type_UUID" RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_UUID" RETURNING `i`, sqlite_fdw_uuid_blob(`u`) + i | u +---+--- +(0 rows) + --Testcase 32: DELETE FROM "type_BIT" RETURNING *; ERROR: no primary key column specified for foreign table @@ -436,9 +447,10 @@ SELECT * FROM type_JSON; --Testcase 64 DELETE FROM type_JSON RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."type_TEXT" RETURNING `col` + col +----- +(0 rows) + ALTER TABLE typetest ALTER COLUMN i OPTIONS (ADD key 'true'); --Testcase 65: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) @@ -511,11 +523,9 @@ INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020. --Testcase 72: INSERT INTO typetest VALUES (4, 'j', 'k', 'l', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING ti c_timestamp; - c_timestamp -------------------------- - 2020-11-05 12:34:56.789 -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (23 bytes) : '2020-11-05 12:34:56.789' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 73: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; @@ -530,11 +540,9 @@ INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2 --Testcase 74: INSERT INTO typetest VALUES (5, 'm', 'n', 'opqrs', '2020.11.06 12:34:56.789', '2020.11.05 12:34:56.789') RETURNING substr(c, 2) sst; - sst ------ - -(1 row) - +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "text" affinity (10 bytes) : 'n ' +CONTEXT: foreign table "typetest" foreign column "i" have data type "bigint" (usual affinity "integer"), processing expression at position 0 in select list --Testcase 75: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; @@ -548,9 +556,10 @@ UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; --Testcase 76: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); UPDATE typetest SET t='upd' WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 77: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -586,9 +595,10 @@ UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i --Testcase 80: UPDATE typetest SET t='upd' WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 81: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; @@ -602,9 +612,10 @@ UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; --Testcase 82: UPDATE typetest SET t='upd' WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 83: EXPLAIN (VERBOSE, COSTS OFF) UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; @@ -618,9 +629,10 @@ UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 84: UPDATE typetest SET t='upd' WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: UPDATE main."typetest" SET `t` = 'upd' WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 85: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=1 RETURNING *; @@ -634,9 +646,10 @@ DELETE FROM typetest WHERE i=1 RETURNING *; --Testcase 86: (i integer, v varchar(10), c char(10), t text, d datetime, ti timestamp); DELETE FROM typetest WHERE i=1 RETURNING *; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 1)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + i | v | c | t | d | ti +---+---+---+---+---+---- +(0 rows) + --Testcase 87: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=2 RETURNING d, c, t, i, ti, v; @@ -672,9 +685,10 @@ DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, --Testcase 90: DELETE FROM typetest WHERE i=3 RETURNING d c_date, c c_char, t c_text, i c_int, ti c_timestamp, v c_varchar; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 3)) RETURNING `i`, `v`, `c`, `t`, `d`, `ti` + c_date | c_char | c_text | c_int | c_timestamp | c_varchar +--------+--------+--------+-------+-------------+----------- +(0 rows) + --Testcase 91: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; @@ -688,9 +702,10 @@ DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; --Testcase 92: DELETE FROM typetest WHERE i=4 RETURNING ti c_timestamp; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 4)) RETURNING `ti` + c_timestamp +------------- +(0 rows) + --Testcase 93: EXPLAIN (VERBOSE, COSTS OFF) DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; @@ -704,9 +719,10 @@ DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; --Testcase 94: DELETE FROM typetest WHERE i=5 RETURNING substr(c, 2) sst; -ERROR: Failed to execute remote SQL -HINT: SQLite error 'another row available', SQLite result code 100 -CONTEXT: SQL query: DELETE FROM main."typetest" WHERE ((`i` = 5)) RETURNING `c` + sst +----- +(0 rows) + --Testcase 95: EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO typetest VALUES (6, 'p', 'q', 'r', '2021.11.06 12:34:56.789', '2021.11.05 12:34:56.789') RETURNING 'ok' t; @@ -761,77 +777,344 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; del (1 row) -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ERROR: type "user_enum" does not exist -LINE 10: c8 user_enum - ^ -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; -ERROR: relation "ft2" does not exist -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); -ERROR: server "loopback" does not exist -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); -ERROR: server "loopback" does not exist -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; -ERROR: relation "ft2" does not exist -LINE 1: INSERT INTO ft2 (c1,c2,c3) - ^ +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 101: +SELECT * FROM ret_base; + c1 | c2 | c3 +------+-----+------- + 1201 | 1 | 01201 + 1202 | 2 | 01202 + 1203 | 3 | 01203 + 1204 | 4 | 01204 + 1205 | 5 | 01205 + 1206 | 6 | 01206 + 1207 | 7 | 01207 + 1208 | 8 | 01208 + 1209 | 9 | 01209 + 1210 | 10 | 01210 + 1211 | 11 | 01211 + 1212 | 12 | 01212 + 1213 | 13 | 01213 + 1214 | 14 | 01214 + 1215 | 15 | 01215 + 1216 | 16 | 01216 + 1217 | 17 | 01217 + 1218 | 18 | 01218 + 1219 | 19 | 01219 + 1220 | 20 | 01220 + 1221 | 21 | 01221 + 1222 | 22 | 01222 + 1223 | 23 | 01223 + 1224 | 24 | 01224 + 1225 | 25 | 01225 + 1226 | 26 | 01226 + 1227 | 27 | 01227 + 1228 | 28 | 01228 + 1229 | 29 | 01229 + 1230 | 30 | 01230 + 1231 | 31 | 01231 + 1232 | 32 | 01232 + 1233 | 33 | 01233 + 1234 | 34 | 01234 + 1235 | 35 | 01235 + 1236 | 36 | 01236 + 1237 | 37 | 01237 + 1238 | 38 | 01238 + 1239 | 39 | 01239 + 1240 | 40 | 01240 + 1241 | 41 | 01241 + 1242 | 42 | 01242 + 1243 | 43 | 01243 + 1244 | 44 | 01244 + 1245 | 45 | 01245 + 1246 | 46 | 01246 + 1247 | 47 | 01247 + 1248 | 48 | 01248 + 1249 | 49 | 01249 + 1250 | 50 | 01250 + 1251 | 51 | 01251 + 1252 | 52 | 01252 + 1253 | 53 | 01253 + 1254 | 54 | 01254 + 1255 | 55 | 01255 + 1256 | 56 | 01256 + 1257 | 57 | 01257 + 1258 | 58 | 01258 + 1259 | 59 | 01259 + 1260 | 60 | 01260 + 1261 | 61 | 01261 + 1262 | 62 | 01262 + 1263 | 63 | 01263 + 1264 | 64 | 01264 + 1265 | 65 | 01265 + 1266 | 66 | 01266 + 1267 | 67 | 01267 + 1268 | 68 | 01268 + 1269 | 69 | 01269 + 1270 | 70 | 01270 + 1271 | 71 | 01271 + 1272 | 72 | 01272 + 1273 | 73 | 01273 + 1274 | 74 | 01274 + 1275 | 75 | 01275 + 1276 | 76 | 01276 + 1277 | 77 | 01277 + 1278 | 78 | 01278 + 1279 | 79 | 01279 + 1280 | 80 | 01280 + 1281 | 81 | 01281 + 1282 | 82 | 01282 + 1283 | 83 | 01283 + 1284 | 84 | 01284 + 1285 | 85 | 01285 + 1286 | 86 | 01286 + 1287 | 87 | 01287 + 1288 | 88 | 01288 + 1289 | 89 | 01289 + 1290 | 90 | 01290 + 1291 | 91 | 01291 + 1292 | 92 | 01292 + 1293 | 93 | 01293 + 1294 | 94 | 01294 + 1295 | 95 | 01295 + 1296 | 96 | 01296 + 1297 | 97 | 01297 + 1298 | 98 | 01298 + 1299 | 99 | 01299 + 1300 | 100 | 01300 +(100 rows) + +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 103: +SELECT * FROM ret_j1t; + c1 | c2 | c3 +----+----+------- + 8 | 5 | 14.2 + 7 | 2 | -14.3 + 12 | 3 | 0.001 + 9 | 3 | -0.5 +(4 rows) + +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +ERROR: SQLite value is not compatible with PostgreSQL column data type +HINT: SQLite value with "integer" affinity : 17 +CONTEXT: foreign table "ret_j2t" foreign column "c3" have data type "double precision" (usual affinity "real"), in query there is reference to foreign column +--Testcase 105: +SELECT * FROM ret_j2t; + c1 | c2 | c3 +----+----+---- +(0 rows) + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: UPDATE ft2 SET c3 = 'foo' - ^ -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -ERROR: relation "ft2" does not exist -LINE 1: UPDATE ft2 SET c3 = 'foo' - ^ +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Update on public.ret_base + Output: ret_base.*, ret_base.c1, ret_base.c2, ret_base.c3, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + -> Merge Join + Output: 'foo'::text, ret_base.c1, ret_base.*, ret_j1t.*, ret_j2t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Merge Join + Output: ret_base.c1, ret_base.*, ret_base.c2, ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Merge Cond: (ret_base.c2 = ret_j1t.c1) + -> Sort + Output: ret_base.c1, ret_base.*, ret_base.c2 + Sort Key: ret_base.c2 + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.*, ret_base.c2 + SQLite query: SELECT `c1`, `c2`, `c3` FROM main."ret_base" WHERE ((`c1` > 1200)) + -> Sort + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + Sort Key: ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1, ret_j1t.c2, ret_j1t.c3 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Sort + Output: ret_j2t.*, ret_j2t.c1 + Sort Key: ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(26 rows) + +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; + ret_base | c1 | c2 | c3 | ret_j1t | c1 | c2 | c3 +----------+----+----+----+---------+----+----+---- +(0 rows) + +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -ERROR: relation "ft2" does not exist -LINE 2: DELETE FROM ft2 - ^ -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Delete on public.ret_base + Output: 100 + -> Foreign Scan + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + SQLite query: SELECT r1.`c1`, CASE WHEN ( r2.`c1` IS NOT NULL) OR ( r2.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r2.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r2.`c1`, '') || "," || COALESCE(r2.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r2.`c3`), '')|| ")") END, CASE WHEN ( r3.`c1` IS NOT NULL) OR ( r3.`c2` IS NOT NULL) OR ( sqlite_fdw_float(r3.`c3`) IS NOT NULL) THEN ("(" || COALESCE(r3.`c1`, '') || "," || COALESCE(r3.`c2`, '') || "," || COALESCE(sqlite_fdw_float(r3.`c3`), '')|| ")") END FROM ((main."ret_base" r1 INNER JOIN main."ret_j1t" r2 ON (((r1.`c2` = r2.`c1`)) AND ((r1.`c1` > 1200)) AND (((r1.`c1` % 10) = 0)))) LEFT JOIN main."ret_j2t" r3 ON (((r2.`c1` = r3.`c1`)))) + -> Hash Left Join + Output: ret_base.c1, ret_j1t.*, ret_j2t.* + Hash Cond: (ret_j1t.c1 = ret_j2t.c1) + -> Hash Join + Output: ret_base.c1, ret_j1t.*, ret_j1t.c1 + Hash Cond: (ret_base.c2 = ret_j1t.c1) + -> Foreign Scan on public.ret_base + Output: ret_base.c1, ret_base.c2, ret_base.c3 + SQLite query: SELECT `c1`, `c2` FROM main."ret_base" WHERE ((`c1` > 1200)) AND (((`c1` % 10) = 0)) + -> Hash + Output: ret_j1t.*, ret_j1t.c1 + -> Foreign Scan on public.ret_j1t + Output: ret_j1t.*, ret_j1t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j1t" + -> Hash + Output: ret_j2t.*, ret_j2t.c1 + -> Foreign Scan on public.ret_j2t + Output: ret_j2t.*, ret_j2t.c1 + SQLite query: SELECT `c1`, `c2`, sqlite_fdw_float(`c3`) FROM main."ret_j2t" +(24 rows) + +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 - ^ -DELETE FROM ft2 WHERE ft2.c1 > 1200; -ERROR: relation "ft2" does not exist -LINE 1: DELETE FROM ft2 WHERE ft2.c1 > 1200; - ^ + ?column? +---------- +(0 rows) + +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -882,5 +1165,8 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to server sqlite2 diff --git a/expected/17.0/type.out b/expected/17.0/type.out index 38998846..8fb741b2 100644 --- a/expected/17.0/type.out +++ b/expected/17.0/type.out @@ -579,7 +579,7 @@ SELECT * FROM "type_DOUBLE"; -- OK, +- Inf --Testcase 47: DROP EXTENSION sqlite_fdw CASCADE; -NOTICE: drop cascades to 52 other objects +NOTICE: drop cascades to 55 other objects DETAIL: drop cascades to server sqlite_svr drop cascades to foreign table department drop cascades to foreign table employee @@ -629,6 +629,9 @@ drop cascades to foreign table fts_table_config drop cascades to foreign table "RO_RW_test" drop cascades to foreign table "Unicode data" drop cascades to foreign table "type_BOOLEAN_oper" +drop cascades to foreign table ret_base +drop cascades to foreign table ret_j1t +drop cascades to foreign table ret_j2t drop cascades to foreign table type_json drop cascades to foreign table "type_BOOLEAN" drop cascades to server sqlite2 diff --git a/sql/13.15/extra/returning.sql b/sql/13.15/extra/returning.sql index 7309c1c4..7d81d402 100644 --- a/sql/13.15/extra/returning.sql +++ b/sql/13.15/extra/returning.sql @@ -243,53 +243,45 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; --Testcase 99: DELETE FROM typetest WHERE i=6 RETURNING 'del'; -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; - -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); - -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); - -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; +--Testcase 101: +SELECT * FROM ret_base; +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; +--Testcase 103: +SELECT * FROM ret_j1t; +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +--Testcase 105: +SELECT * FROM ret_j2t; + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -DELETE FROM ft2 WHERE ft2.c1 > 1200; +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; diff --git a/sql/14.12/extra/returning.sql b/sql/14.12/extra/returning.sql index 7309c1c4..7d81d402 100644 --- a/sql/14.12/extra/returning.sql +++ b/sql/14.12/extra/returning.sql @@ -243,53 +243,45 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; --Testcase 99: DELETE FROM typetest WHERE i=6 RETURNING 'del'; -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; - -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); - -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); - -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; +--Testcase 101: +SELECT * FROM ret_base; +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; +--Testcase 103: +SELECT * FROM ret_j1t; +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +--Testcase 105: +SELECT * FROM ret_j2t; + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -DELETE FROM ft2 WHERE ft2.c1 > 1200; +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; diff --git a/sql/15.7/extra/returning.sql b/sql/15.7/extra/returning.sql index 7309c1c4..7d81d402 100644 --- a/sql/15.7/extra/returning.sql +++ b/sql/15.7/extra/returning.sql @@ -243,53 +243,45 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; --Testcase 99: DELETE FROM typetest WHERE i=6 RETURNING 'del'; -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; - -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); - -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); - -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; +--Testcase 101: +SELECT * FROM ret_base; +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; +--Testcase 103: +SELECT * FROM ret_j1t; +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +--Testcase 105: +SELECT * FROM ret_j2t; + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -DELETE FROM ft2 WHERE ft2.c1 > 1200; +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; diff --git a/sql/16.3/extra/returning.sql b/sql/16.3/extra/returning.sql index 7309c1c4..7d81d402 100644 --- a/sql/16.3/extra/returning.sql +++ b/sql/16.3/extra/returning.sql @@ -243,53 +243,45 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; --Testcase 99: DELETE FROM typetest WHERE i=6 RETURNING 'del'; -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; - -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); - -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); - -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; +--Testcase 101: +SELECT * FROM ret_base; +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; +--Testcase 103: +SELECT * FROM ret_j1t; +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +--Testcase 105: +SELECT * FROM ret_j2t; + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -DELETE FROM ft2 WHERE ft2.c1 > 1200; +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; diff --git a/sql/17.0/extra/returning.sql b/sql/17.0/extra/returning.sql index 7309c1c4..7d81d402 100644 --- a/sql/17.0/extra/returning.sql +++ b/sql/17.0/extra/returning.sql @@ -243,53 +243,45 @@ DELETE FROM typetest WHERE i=6 RETURNING 'del'; --Testcase 99: DELETE FROM typetest WHERE i=6 RETURNING 'del'; -CREATE FOREIGN TABLE ft2 ( - c1 int NOT NULL, - c2 int NOT NULL, - cx int, - c3 text, - c4 timestamptz, - c5 timestamp, - c6 varchar(10), - c7 char(10) default 'ft2', - c8 user_enum -) SERVER loopback; -ALTER FOREIGN TABLE ft2 DROP COLUMN cx; - -CREATE FOREIGN TABLE ft4 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 3'); - -CREATE FOREIGN TABLE ft5 ( - c1 int NOT NULL, - c2 int NOT NULL, - c3 text -) SERVER loopback OPTIONS (schema_name 'S 1', table_name 'T 4'); - -- Test UPDATE/DELETE with RETURNING on a three-table join -INSERT INTO ft2 (c1,c2,c3) - SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id; +--Testcase 100: +INSERT INTO ret_base (c1,c2,c3) + SELECT id, id - 1200, to_char(id, 'FM00000') FROM generate_series(1201, 1300) id RETURNING *; +--Testcase 101: +SELECT * FROM ret_base; +--Testcase 102: +INSERT INTO ret_j1t (c1, c2, c3) VALUES (8, 5, 14.2), (7, 2, -14.3), (12, 3, 0.001), (9, 3, -0.5) RETURNING *; +--Testcase 103: +SELECT * FROM ret_j1t; +--Testcase 104: +INSERT INTO ret_j2t (c1, c2, c3) VALUES (8, 18, 5.8), (7, 41, 2.1), (12, 28, -0.09), (9, 14, 17.0) RETURNING *; +--Testcase 105: +SELECT * FROM ret_j2t; + +--Testcase 106: EXPLAIN (verbose, costs off) -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; -- can be pushed down -UPDATE ft2 SET c3 = 'foo' - FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c2 = ft4.c1 - RETURNING ft2, ft2.*, ft4, ft4.*; +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; -- can be pushed down +--Testcase 107: +UPDATE ret_base SET c3 = 'foo' + FROM ret_j1t INNER JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c2 = ret_j1t.c1 + RETURNING ret_base, ret_base.*, ret_j1t, ret_j1t.*; +--Testcase 108: EXPLAIN (verbose, costs off) -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -- can be pushed down -DELETE FROM ft2 - USING ft4 LEFT JOIN ft5 ON (ft4.c1 = ft5.c1) - WHERE ft2.c1 > 1200 AND ft2.c1 % 10 = 0 AND ft2.c2 = ft4.c1 +--Testcase 109: +DELETE FROM ret_base + USING ret_j1t LEFT JOIN ret_j2t ON (ret_j1t.c1 = ret_j2t.c1) + WHERE ret_base.c1 > 1200 AND ret_base.c1 % 10 = 0 AND ret_base.c2 = ret_j1t.c1 RETURNING 100; -DELETE FROM ft2 WHERE ft2.c1 > 1200; +--Testcase 110: +DELETE FROM ret_base WHERE ret_base.c1 > 1200; --Testcase 200: DROP EXTENSION sqlite_fdw CASCADE; diff --git a/sql/init_data/init.sql b/sql/init_data/init.sql index a6c53b40..b7b0dc35 100644 --- a/sql/init_data/init.sql +++ b/sql/init_data/init.sql @@ -66,7 +66,7 @@ CREATE TABLE "A a" (col int primary key); -- test for issue #44 github CREATE VIRTUAL TABLE fts_table USING fts5(name, description, tokenize = porter); --- updatable option test (github pull 59) +-- updatable + force_readonly options test CREATE TABLE RO_RW_test ( i int primary key not null, a text, @@ -111,4 +111,9 @@ WITH booldata AS ( ) SELECT ROW_NUMBER() OVER () i, t1.i i1, t1.b b1, t2.i i2, t2.b b2 FROM booldata t1 INNER JOIN booldata t2 ON 1; +-- RETURNING for UPDATE/DELETE ... FROM ret_base JOIN ret_j1t JOIN ret_j2t +CREATE TABLE ret_base (c1 int primary key, c2 int, c3 text); +CREATE TABLE ret_j1t (c1 int primary key, c2 int, c3 float); +CREATE TABLE ret_j2t (c1 int primary key, c2 int, c3 float); + analyze; diff --git a/sqlite_fdw.c b/sqlite_fdw.c index d7618134..3366b17b 100644 --- a/sqlite_fdw.c +++ b/sqlite_fdw.c @@ -133,18 +133,20 @@ enum FdwScanPrivateIndex * 2) Integer list of target attribute numbers for INSERT/UPDATE * (NIL for a DELETE) * 3) Length till the end of VALUES clause for INSERT - * (-1 for a DELETE/UPDATE) + * (-1 for a DELETE/UPDATE) Pg 14+ * 4) Boolean flag showing if the remote query has a RETURNING clause * 5) Integer list of attribute numbers retrieved by RETURNING, if any */ - enum FdwModifyPrivateIndex +enum FdwModifyPrivateIndex { /* SQL statement to execute remotely (as a String node) */ FdwModifyPrivateUpdateSql, /* Integer list of target attribute numbers for INSERT/UPDATE */ FdwModifyPrivateTargetAttnums, +#if (PG_VERSION_NUM >= 140000) /* Length till the end of VALUES clause (as an Integer node) */ FdwModifyPrivateLen, +#endif /* has-returning flag (as a Boolean node) */ FdwModifyPrivateHasReturning, /* Integer list of attribute numbers retrieved by RETURNING */ @@ -1413,12 +1415,9 @@ make_tuple_from_result_row(sqlite3_stmt * stmt, attinmeta, attnum, sqlite_value_affinity, AffinityBehaviourFlags); - if (!sqlite_converted.isnull) { - is_null[attnum] = false; + is_null[attnum] = sqlite_converted.isnull; + if (!sqlite_converted.isnull) row[attnum] = sqlite_converted.value; - } - else - is_null[attnum] = true; } stmt_colid++; } @@ -1500,7 +1499,7 @@ sqliteIterateForeignScan(ForeignScanState *node) } else { - sqlitefdw_report_error(ERROR, festate->stmt, festate->conn, NULL, rc); + sqlitefdw_report_error(ERROR, festate->stmt, festate->conn, __func__, rc); } } MemoryContextSwitchTo(oldcontext); @@ -1538,7 +1537,7 @@ sqliteIterateForeignScan(ForeignScanState *node) } else { - sqlitefdw_report_error(ERROR, festate->stmt, festate->conn, NULL, rc); + sqlitefdw_report_error(ERROR, festate->stmt, festate->conn, __func__, rc); } } return tupleSlot; @@ -1829,7 +1828,6 @@ sqlitePlanForeignModify(PlannerInfo *root, * Build the fdw_private list that will be available to the executor. * Items in the list must match enum FdwModifyPrivateIndex, above. */ - #if (PG_VERSION_NUM >= 140000) return list_make5(makeString(sql.data), targetAttrs, @@ -1841,10 +1839,15 @@ sqlitePlanForeignModify(PlannerInfo *root, #endif retrieved_attrs); #else - return list_make4(makeString(sql.data), + /*return list_make4(makeString(sql.data), targetAttrs, makeInteger(values_end_len), + retrieved_attrs);*/ + return list_make4(makeString(sql.data), + targetAttrs, + makeInteger((retrieved_attrs != NIL)), retrieved_attrs); + #endif } @@ -1895,7 +1898,11 @@ sqliteBeginForeignModify(ModifyTableState *mtstate, fmstate->has_returning = intVal(list_nth(fdw_private, FdwModifyPrivateHasReturning)); #endif fmstate->retrieved_attrs = (List *) list_nth(fdw_private, FdwModifyPrivateTargetAttnums); +#if PG_VERSION_NUM >= 140000 fmstate->values_end = intVal(list_nth(fdw_private, FdwModifyPrivateLen)); +#else + fmstate->values_end = -1; +#endif fmstate->orig_query = pstrdup(fmstate->query); n_params = list_length(fmstate->retrieved_attrs) + 1; @@ -2870,7 +2877,7 @@ get_returning_data(ForeignScanState *node) #if (PG_VERSION_NUM >= 140000) ResultRelInfo *resultRelInfo = node->resultRelInfo; #else - ResultRelInfo *resultRelInfo = estate->es_result_relation_info; + ResultRelInfo *resultRelInfo = estate->es_result_relation_info; #endif TupleTableSlot *tupleSlot = node->ss.ss_ScanTupleSlot; TupleTableSlot *resultSlot; @@ -2906,7 +2913,6 @@ get_returning_data(ForeignScanState *node) */ PG_TRY(); { - make_tuple_from_result_row(dmstate->stmt, tupleDescriptor, dmstate->retrieved_attrs, @@ -2918,7 +2924,7 @@ get_returning_data(ForeignScanState *node) } PG_CATCH(); { - //PQclear(dmstate->result); + /* reset? dmstate->stmt; */ PG_RE_THROW(); } PG_END_TRY(); @@ -5441,7 +5447,7 @@ sqlite_store_returning_result(SqliteFdwExecState *fmstate, } else { - sqlitefdw_report_error(ERROR, fmstate->stmt, fmstate->conn, NULL, rc); + sqlitefdw_report_error(ERROR, fmstate->stmt, fmstate->conn, __func__, rc); } rc = sqlite3_step(fmstate->stmt); } /* while (1) */