Richard, with "PRAGMA reverse_unordered_selects = 1;". it's returns count(*)=0. This is strange for me and not help for development.
2010/10/26 Richard Hipp <d...@sqlite.org> > On Mon, Oct 25, 2010 at 4:06 PM, Alexey Pechnikov <pechni...@mobigroup.ru > >wrote: > > > > The result of the view above is undefined. It will choose one of the > > > user_record rows for each distinct user.id, but you don't know which > > row. > > > > Yes! But it choose only single user_record row for two distinct user_id > in > > count(*) expression. > > > > Are you really think that count(*)=1 for _two_ rows is not the bug? > > > > You miss my point. "test" in this case doesn't have one row or two rows. > It has an arbitrary number of rows due to indeterminacy in your view. > Sometimes "test" will return one row. Sometimes it will return two. You > can never predict which. Both are "correct" in the sense that both are > allowed interpretations of what SQLite ought to do. > > The above will never happen for a simple table named "test". It only > happens for things like: > > ... WHERE record_id IN (SELECT record_id FROM view_user WHERE name LIKE > '%'); > > where the record_id value returned from the view_user view is > indeterminate. The WHERE clause above might be equivalent to > > ... WHERE record_id IN (76,86) > > and in that case count(*) will return 2. But the WHERE clause might also > be > equivalent to > > ... WHERE record_id IN (76,87) > > in which case count(*) will return 1. SQLite is free to choose either > interpretation for the subquery in your WHERE clause, and hence might get > either 1 or 2 as the count(*) result. Version 3.7.2 happened to get 2. > Version 3.7.3 happens to get 1. Who knows what 3.7.4 will get - both > answers are correct.... > > > > sqlite> select * from test; > > 4|87|3|4|B > > 11|76|8|11|A > > sqlite> select count(*) from test; > > 1 > > ------------------------------------------------------------ > > CREATE TABLE user > > ( > > id INTEGER PRIMARY KEY > > ); > > INSERT INTO "user" VALUES(4); > > INSERT INTO "user" VALUES(11); > > > > CREATE TABLE user_record > > ( > > record_id INTEGER PRIMARY KEY, > > record_version INTEGER, > > user_id INTEGER NOT NULL, > > name TEXT > > ); > > INSERT INTO "user_record" VALUES(76,8,11,'A'); > > INSERT INTO "user_record" VALUES(86,11,4,'B'); > > INSERT INTO "user_record" VALUES(87,3,4,'B'); > > > > CREATE VIEW view_user AS > > SELECT user.id,user_record.* > > FROM user, user_record > > WHERE user.id=user_record.user_id > > GROUP BY user.id; > > > > create temp view test as select * from main.view_user where record_id in > > (select record_id from main.view_user where name like '%'); > > > > select * from test; > > select count(*) from test; > > ------------------------------------------------------------ > > > > -- > > Best regards, Alexey Pechnikov. > > http://pechnikov.tel/ > > _______________________________________________ > > sqlite-users mailing list > > sqlite-users@sqlite.org > > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > > > > > > -- > D. Richard Hipp > d...@sqlite.org > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > -- Best regards, Alexey Pechnikov. http://pechnikov.tel/ _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users