aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2017-11-09 03:55:09 +0000
committerdrh <drh@noemail.net>2017-11-09 03:55:09 +0000
commit2fba394c97f9d9cf6b6c447dd5c2d01651593c73 (patch)
treee853233f4278cbb4ed8b8965e91e5e989074cf80
parent3e846cb81ff05c85c5a8e1a982a11f6b6d5d7764 (diff)
downloadsqlite-2fba394c97f9d9cf6b6c447dd5c2d01651593c73.tar.gz
sqlite-2fba394c97f9d9cf6b6c447dd5c2d01651593c73.zip
Disallow ORDER BY and LIMIT on UPDATE and DELETE of views and WITHOUT ROWID
tables. This is a temporary fix for ticket [d4beea1633f1b88f] until a better solution can be found. FossilOrigin-Name: 62fe56b59270d9d7372b1bb8a53788a40d20d0f111fe38c61dd6269848592c70
-rw-r--r--manifest16
-rw-r--r--manifest.uuid2
-rw-r--r--src/resolve.c6
-rw-r--r--test/wherelimit.test37
4 files changed, 51 insertions, 10 deletions
diff --git a/manifest b/manifest
index 22a536158..9a2dbc0bc 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sproblem\scausing\sLSM\sto\sadd\sunnecessary\spadding\sto\sempty\ssegments\sin\ncompressed\sdatabases.
-D 2017-11-08T11:14:53.660
+C Disallow\sORDER\sBY\sand\sLIMIT\son\sUPDATE\sand\sDELETE\sof\sviews\sand\sWITHOUT\sROWID\ntables.\s\sThis\sis\sa\stemporary\sfix\sfor\sticket\s[d4beea1633f1b88f]\suntil\sa\sbetter\nsolution\scan\sbe\sfound.
+D 2017-11-09T03:55:09.531
F Makefile.in b142eb20482922153ebc77b261cdfd0a560ed05a81e9f6d9a2b0e8192922a1d2
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc a55372a22454e742ba7c8f6edf05b83213ec01125166ad7dcee0567e2f7fc81b
@@ -468,7 +468,7 @@ F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
F src/prepare.c 7cf451f903ad92a14e22de415a13e7a7d30f1bd23b3d21eeb0dc7264723244c5
F src/printf.c 40aee47ae9be4bd3dbdc8968bd07fddc027be8edec8daddf24d3391d36698a1c
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
-F src/resolve.c 5a461643f294ec510ca615b67256fc3861e4c8eff5f29e5940491e70553b1955
+F src/resolve.c 704978e5aabb9f524789e3b53016b4068a4e64c669c0f8ff025d2b23b95d62b5
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
F src/select.c 660ef7977841fb462f24c8561e4212615bb6e5c9835fd3556257ce8316c50fee
F src/shell.c.in 08cbffc31900359fea85896342a46147e9772c370d8a5079b7be26e3a1f50e8a
@@ -1557,7 +1557,7 @@ F test/whereI.test eab5b226bbc344ac70d7dc09b963a064860ae6d7
F test/whereJ.test 55a3221706a7ab706293f17cc8f96da563bf0767
F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b
F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864
-F test/wherelimit.test 5e9fd41e79bb2b2d588ed999d641d9c965619b31
+F test/wherelimit.test baa8e5e30b2eddc395cbb3edb313deea14ca6938ea8a96c02a03c34d0ab84b5b
F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c
F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74
F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
@@ -1673,7 +1673,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P db8f22d069b1725f16b208c96c0c47b6ab0e30236feeac43cca4217ef80316b8
-R 6c8e575584f16f8416ee1b9774368bff
-U dan
-Z 515295e5c95123e6255cf7559983f082
+P 1bc2d04645c5239ba9a30a13f6fb3c8cc46461c864e7927012bc0ad305eb705e
+R a028f3be0864f739aeb3787daf46fc8e
+U drh
+Z 97937a65b1ac3d4b961579eac7d25cbd
diff --git a/manifest.uuid b/manifest.uuid
index bac99cd8b..e270b8e48 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-1bc2d04645c5239ba9a30a13f6fb3c8cc46461c864e7927012bc0ad305eb705e \ No newline at end of file
+62fe56b59270d9d7372b1bb8a53788a40d20d0f111fe38c61dd6269848592c70 \ No newline at end of file
diff --git a/src/resolve.c b/src/resolve.c
index 4a1e8284c..945654ead 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -596,7 +596,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
SrcList *pSrcList = pNC->pSrcList;
struct SrcList_item *pItem;
assert( pSrcList && pSrcList->nSrc==1 );
- pItem = pSrcList->a;
+ pItem = pSrcList->a;
+ if( !HasRowid(pItem->pTab) || pItem->pTab->pSelect!=0 ){
+ sqlite3ErrorMsg(pParse, "ORDER BY and LIMIT not support for table %s",
+ pItem->pTab->zName);
+ }
pExpr->op = TK_COLUMN;
pExpr->pTab = pItem->pTab;
pExpr->iTable = pItem->iCursor;
diff --git a/test/wherelimit.test b/test/wherelimit.test
index f0cfbb61e..e10d90b40 100644
--- a/test/wherelimit.test
+++ b/test/wherelimit.test
@@ -279,6 +279,43 @@ ifcapable {update_delete_limit} {
execsql {SELECT count(*) FROM t1 WHERE y=1}
} {6}
+ # Cannot use a LIMIT for UPDATE or DELETE against a WITHOUT ROWID table
+ # or a VIEW. (We should fix this someday).
+ #
+ db close
+ sqlite3 db :memory:
+ do_execsql_test wherelimit-4.1 {
+ CREATE TABLE t1(a int);
+ INSERT INTO t1 VALUES(1);
+ INSERT INTO t1 VALUES(2);
+ INSERT INTO t1 VALUES(3);
+ CREATE TABLE t2(a int);
+ INSERT INTO t2 SELECT a+100 FROM t1;
+ CREATE VIEW tv(r,a) AS
+ SELECT rowid, a FROM t2 UNION ALL SELECT rowid, a FROM t1;
+ CREATE TRIGGER tv_del INSTEAD OF DELETE ON tv
+ BEGIN
+ DELETE FROM t1 WHERE rowid=old.r;
+ DELETE FROM t2 WHERE rowid=old.r;
+ END;
+ } {}
+ do_catchsql_test wherelimit-4.2 {
+ DELETE FROM tv WHERE 1 LIMIT 2;
+ } {1 {ORDER BY and LIMIT not support for table tv}}
+ do_catchsql_test wherelimit-4.3 {
+ DELETE FROM tv WHERE 1 ORDER BY a LIMIT 2;
+ } {1 {ORDER BY and LIMIT not support for table tv}}
+ do_execsql_test wherelimit-4.10 {
+ CREATE TABLE t3(a,b,c,d TEXT, PRIMARY KEY(a,b)) WITHOUT ROWID;
+ INSERT INTO t3(a,b,c,d) VALUES(1,2,3,4),(5,6,7,8),(9,10,11,12);
+ } {}
+ do_catchsql_test wherelimit-4.11 {
+ DELETE FROM t3 WHERE a=5 LIMIT 2;
+ } {1 {ORDER BY and LIMIT not support for table t3}}
+ do_execsql_test wherelimit-4.12 {
+ SELECT a,b,c,d FROM t3 ORDER BY 1;
+ } {1 2 3 4 5 6 7 8 9 10 11 12}
+
}
finish_test