On November 20, 2009 08:11:26 pm Simon Slavin wrote: > On 21 Nov 2009, at 12:57am, Phil Longstaff wrote: > > I have an sqlite3 database where a SELECT hangs. The statement is: > > > > SELECT DISTINCT t.* FROM transactions AS t, splits AS s WHERE > > s.tx_guid=t.guid AND ((s.account_guid IN > > ('d076626fc5be59df7e592f8f0d66c7cd'))) > > > > Are there any tools to help me diagnose the problem? I could download > > the source and build with debug and try to trace my way through, but > > would prefer some pre-built diagnostic/debug tools if possible. > > I've no idea what's causing your problem so I'm asking questions at random. > What's the deal with the double bracketing ? I'm not insulting you, I'm > curious and don't know if it's useful for something. Try removing layers > of the brackets in case it makes something work.
The statement is generated from a query represented as a list of lists (outer list is OR, inner list is AND, each item is a term). I add extra parentheses just to help me keep the statement meaning clear. > > Are you executing this in your code, or in the sqlite3 command-line tool ? > If the former, please try the latter and see if you get the same result. This comes from my code, but I get the same thing from the sqlite3 command line. Interestingly, that statement now, works, but this one (similar) doesn't. sqlite> SELECT DISTINCT t.* FROM transactions AS t, splits AS s WHERE s.tx_guid=t.guid AND s.account_guid='e3ea8186deb3a9c160ab3b9409ea618f'; ^CSQL error: interrupted sqlite> I interrupted it after 2 minutes with no output. sqlite> explain SELECT DISTINCT t.* FROM transactions AS t, splits AS s WHERE s.tx_guid=t.guid AND s.account_guid='e3ea8186deb3a9c160ab3b9409ea618f'; 0|Trace|0|0|0||00| 1|Noop|0|0|0||00| 2|Integer|0|8|0||00| 3|Integer|0|7|0||00| 4|Gosub|10|57|0||00| 5|String8|0|23|0|e3ea8186deb3a9c160ab3b9409ea618f|00| 6|Goto|0|65|0||00| 7|OpenRead|0|273|0|6|00| 8|OpenRead|3|275|0|keyinfo(1,BINARY)|00| 9|OpenRead|1|185|0|3|00| 10|Rewind|3|40|24|0|00| 11|IdxRowid|3|24|0||00| 12|Seek|0|24|0||00| 13|Rewind|1|39|0||00| 14|Column|1|1|25||00| 15|Column|3|0|26||00| 16|Ne|26|38|25|collseq(BINARY)|6a| 17|Column|1|2|27||00| 18|Ne|23|38|27|collseq(BINARY)|69| 19|Column|3|0|17||00| 20|Column|0|1|18||00| 21|Column|0|2|19||00| 22|Column|0|3|20||00| 23|Column|0|4|21||00| 24|Column|0|5|22||00| 25|Compare|11|17|6|keyinfo(6,BINARY,BINARY)|00| 26|Jump|27|31|27||00| 27|Move|17|11|6||00| 28|Gosub|9|47|0||00| 29|IfPos|8|64|0||00| 30|Gosub|10|57|0||00| 31|Column|3|0|1||00| 32|Column|0|1|2||00| 33|Column|0|2|3||00| 34|Column|0|3|4||00| 35|Column|0|4|5||00| 36|Column|0|5|6||00| 37|Integer|1|7|0||00| 38|Next|1|14|0||01| 39|Next|3|11|0||00| 40|Close|0|0|0||00| 41|Close|3|0|0||00| 42|Close|1|0|0||00| 43|Gosub|9|47|0||00| 44|Goto|0|64|0||00| 45|Integer|1|8|0||00| 46|Return|9|0|0||00| 47|IfPos|7|49|0||00| 48|Return|9|0|0||00| 49|SCopy|1|29|0||00| 50|SCopy|2|30|0||00| 51|SCopy|3|31|0||00| 52|SCopy|4|32|0||00| 53|SCopy|5|33|0||00| 54|SCopy|6|34|0||00| 55|ResultRow|29|6|0||00| 56|Return|9|0|0||00| 57|Null|0|1|0||00| 58|Null|0|2|0||00| 59|Null|0|3|0||00| 60|Null|0|4|0||00| 61|Null|0|5|0||00| 62|Null|0|6|0||00| 63|Return|10|0|0||00| 64|Halt|0|0|0||00| 65|Transaction|0|0|0||00| 66|VerifyCookie|0|83|0||00| 67|TableLock|0|273|0|transactions|00| 68|TableLock|0|185|0|splits|00| 69|Goto|0|7|0||00| > > I would try using EXPLAIN on that command: just put 'EXPLAIN ' before the > SELECT command and see what you get out. It's possible that the EXPLAIN > command will hang too. Also there's EXPLAIN QUERY PLAN. sqlite> explain query plan SELECT DISTINCT t.* FROM transactions AS t, splits AS s WHERE s.tx_guid=t.guid AND s.account_guid='e3ea8186deb3a9c160ab3b9409ea618f'; 0|0|TABLE transactions AS t WITH INDEX sqlite_autoindex_transactions_1 ORDER BY 1|1|TABLE splits AS s sqlite> Hmmm... There are indices. I recently modified the splits table, removing "NOT NULL" from a column. I then copied the data into the new table using: CREATE TABLE splits_new (...) INSERT INTO splits_new SELECT FROM splits DROP TABLE splits ALTER TABLE splits_new RENAME TO splits How can I force the indices to be regenerated? _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users