It seems that this example now works as expected: CREATE TABLE t1 (c0, c1 REAL, PRIMARY KEY (c1, c0)); INSERT INTO t1(c1) VALUES (0X7ffffffffffffff);; SELECT * FROM t1 WHERE c1 IN (SELECT c1 FROM t1);
I guess that this test case triggered the same issue as the one I later reported in the email "Series of statements results in a malformed database disk image" [1], which has been fixed (see https://www.sqlite.org/src/tktview/6c1d3febc00b22d457c7). So I think that this bug report can be considered a duplicate of the later one. [1] http://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-users/2019-May/084483.html On Sat, May 4, 2019 at 8:43 PM Keith Medcalf <[email protected]> wrote: > > I should think so yes ... The query only appears to work if the index on > the real value is not used -- but there appears no way to do that when > using the IN operator ... > > QUERY PLAN > |--SEARCH TABLE t1 USING COVERING INDEX sqlite_autoindex_t1_1 (c1=?) (~240 > rows) > `--LIST SUBQUERY 1 > `--SCAN TABLE t1 (~1048576 rows) > addr opcode p1 p2 p3 p4 p5 comment > ---- ------------- ---- ---- ---- ------------- -- ------------- > 0 Init 0 37 0 00 Start at 37 > 1 OpenRead 2 3 0 k(3,,,) 02 root=3 iDb=0; > sqlite_autoindex_t1_1 > 2 ColumnsUsed 2 0 0 3 00 > 3 Explain 3 0 0 SEARCH TABLE t1 USING COVERING > INDEX sqlite_autoindex_t1_1 (c1=?) (~240 rows) 00 > 4 Noop 0 0 0 00 Begin > WHERE-loop0: t1 > 5 Integer 21 2 0 00 r[2]=21; return > address > 6 Once 0 21 0 00 > 7 OpenEphemeral 3 1 0 k(1,B) 00 nColumn=1; > Result of SELECT 1 > 8 OpenRead 1 2 0 2 00 root=2 iDb=0; t1 > 9 ColumnsUsed 1 0 0 2 00 > 10 Explain 10 0 0 SCAN TABLE t1 (~1048576 rows) 00 > 11 Noop 0 0 0 00 Begin > WHERE-loop0: t1 > 12 Rewind 1 20 0 00 > 13 Noop 0 0 0 00 Begin > WHERE-core > 14 Column 1 1 3 00 r[3]=t1.c1 > 15 RealAffinity 3 0 0 00 > 16 MakeRecord 3 1 4 C 00 > r[4]=mkrec(r[3]) > 17 IdxInsert 3 4 3 1 00 key=r[4] > 18 Noop 0 0 0 00 End WHERE-core > 19 Next 1 13 0 01 > 20 Noop 0 0 0 00 End WHERE-loop0: > t1 > 21 Return 2 0 0 00 > 22 Rewind 3 35 0 00 > 23 Column 3 0 1 00 r[1]= > 24 IsNull 1 34 0 00 if r[1]==NULL > goto 34 > 25 SeekGE 2 34 1 1 00 key=r[1] > 26 IdxGT 2 34 1 1 00 key=r[1] > 27 Noop 0 0 0 00 Begin > WHERE-core > 28 Column 2 1 5 00 r[5]=t1.c0 > 29 Column 2 0 6 00 r[6]=t1.c1 > 30 RealAffinity 6 0 0 00 > 31 ResultRow 5 2 0 00 > output=r[5..6] > 32 Noop 0 0 0 00 End > WHERE-core > 33 Next 2 26 0 00 > 34 Next 3 23 0 00 > 35 Noop 0 0 0 00 End WHERE-loop0: > t1 > 36 Halt 0 0 0 00 > 37 Transaction 0 0 1 0 01 usesStmtJournal=0 > 38 Goto 0 1 0 00 > sqlite> > > sqlite> SELECT * FROM t1 NOT INDEXED WHERE c1 IN (SELECT c1 FROM t1); > QUERY PLAN > |--SCAN TABLE t1 (~983040 rows) > `--USING INDEX sqlite_autoindex_t1_1 FOR IN-OPERATOR > addr opcode p1 p2 p3 p4 p5 comment > ---- ------------- ---- ---- ---- ------------- -- ------------- > 0 Init 0 23 0 00 Start at 23 > 1 OpenRead 0 2 0 2 00 root=2 iDb=0; t1 > 2 ColumnsUsed 0 0 0 3 00 > 3 Explain 3 0 0 SCAN TABLE t1 (~983040 rows) 00 > 4 Noop 0 0 0 00 Begin > WHERE-loop0: t1 > 5 Rewind 0 21 0 00 > 6 Noop 0 0 0 00 begin IN expr > 7 Once 0 9 0 00 > 8 OpenRead 2 3 0 k(3,,,) 00 root=3 iDb=0; > sqlite_autoindex_t1_1 > 9 Column 0 1 1 00 r[1]=t1.c1 > 10 RealAffinity 1 0 0 00 > 11 IsNull 1 20 0 00 if r[1]==NULL > goto 20 > 12 Affinity 1 1 0 C 00 affinity(r[1]) > 13 NotFound 2 20 1 1 00 key=r[1]; end > IN expr > 14 Noop 0 0 0 00 Begin > WHERE-core > 15 Column 0 0 2 00 r[2]=t1.c0 > 16 Column 0 1 3 00 r[3]=t1.c1 > 17 RealAffinity 3 0 0 00 > 18 ResultRow 2 2 0 00 output=r[2..3] > 19 Noop 0 0 0 00 End WHERE-core > 20 Next 0 6 0 01 > 21 Noop 0 0 0 00 End WHERE-loop0: > t1 > 22 Halt 0 0 0 00 > 23 Transaction 0 0 1 0 01 usesStmtJournal=0 > 24 Goto 0 1 0 00 > > sqlite> SELECT * FROM t1 not indexed WHERE c1 IN (SELECT c1 FROM t1 not > indexed); > QUERY PLAN > |--SCAN TABLE t1 (~983040 rows) > `--USING INDEX sqlite_autoindex_t1_1 FOR IN-OPERATOR > addr opcode p1 p2 p3 p4 p5 comment > ---- ------------- ---- ---- ---- ------------- -- ------------- > 0 Init 0 23 0 00 Start at 23 > 1 OpenRead 0 2 0 2 00 root=2 iDb=0; t1 > 2 ColumnsUsed 0 0 0 3 00 > 3 Explain 3 0 0 SCAN TABLE t1 (~983040 rows) 00 > 4 Noop 0 0 0 00 Begin > WHERE-loop0: t1 > 5 Rewind 0 21 0 00 > 6 Noop 0 0 0 00 begin IN expr > 7 Once 0 9 0 00 > 8 OpenRead 2 3 0 k(3,,,) 00 root=3 iDb=0; > sqlite_autoindex_t1_1 > 9 Column 0 1 1 00 r[1]=t1.c1 > 10 RealAffinity 1 0 0 00 > 11 IsNull 1 20 0 00 if r[1]==NULL > goto 20 > 12 Affinity 1 1 0 C 00 affinity(r[1]) > 13 NotFound 2 20 1 1 00 key=r[1]; end > IN expr > 14 Noop 0 0 0 00 Begin > WHERE-core > 15 Column 0 0 2 00 r[2]=t1.c0 > 16 Column 0 1 3 00 r[3]=t1.c1 > 17 RealAffinity 3 0 0 00 > 18 ResultRow 2 2 0 00 output=r[2..3] > 19 Noop 0 0 0 00 End WHERE-core > 20 Next 0 6 0 01 > 21 Noop 0 0 0 00 End WHERE-loop0: > t1 > 22 Halt 0 0 0 00 > 23 Transaction 0 0 1 0 01 usesStmtJournal=0 > 24 Goto 0 1 0 00 > sqlite> > > sqlite> SELECT * FROM t1 NOT INDEXED WHERE c1 == (SELECT c1 FROM t1); > QUERY PLAN > |--SCAN TABLE t1 (~262144 rows) > `--SCALAR SUBQUERY 1 > `--SCAN TABLE t1 (~1048576 rows) > addr opcode p1 p2 p3 p4 p5 comment > ---- ------------- ---- ---- ---- ------------- -- ------------- > 0 Init 0 35 0 00 Start at 35 > 1 OpenRead 0 2 0 2 00 root=2 iDb=0; t1 > 2 ColumnsUsed 0 0 0 3 00 > 3 Explain 3 0 0 SCAN TABLE t1 (~262144 rows) 00 > 4 Noop 0 0 0 00 Begin > WHERE-loop0: t1 > 5 Rewind 0 33 0 00 > 6 Column 0 1 1 00 r[1]=t1.c1 > 7 RealAffinity 1 0 0 00 > 8 Integer 24 3 0 00 r[3]=24; > return address > 9 Once 0 24 0 00 > 10 Null 0 4 4 00 r[4..4]=NULL; > Init subquery result > 11 Integer 1 5 0 00 r[5]=1; LIMIT > counter > 12 OpenRead 1 2 0 2 00 root=2 iDb=0; > t1 > 13 ColumnsUsed 1 0 0 2 00 > 14 Explain 14 0 0 SCAN TABLE t1 (~1048576 rows) 00 > 15 Noop 0 0 0 00 Begin > WHERE-loop0: t1 > 16 Rewind 1 23 0 00 > 17 Noop 0 0 0 00 Begin > WHERE-core > 18 Column 1 1 4 00 r[4]=t1.c1 > 19 RealAffinity 4 0 0 00 > 20 DecrJumpZero 5 24 0 00 if > (--r[5])==0 goto 24 > 21 Noop 0 0 0 00 End > WHERE-core > 22 Next 1 17 0 01 > 23 Noop 0 0 0 00 End > WHERE-loop0: t1 > 24 Return 3 0 0 00 > 25 Ne 4 32 1 (BINARY) 53 if r[1]!=r[4] > goto 32 > 26 Noop 0 0 0 00 Begin > WHERE-core > 27 Column 0 0 6 00 r[6]=t1.c0 > 28 Column 0 1 7 00 r[7]=t1.c1 > 29 RealAffinity 7 0 0 00 > 30 ResultRow 6 2 0 00 output=r[6..7] > 31 Noop 0 0 0 00 End WHERE-core > 32 Next 0 6 0 01 > 33 Noop 0 0 0 00 End WHERE-loop0: > t1 > 34 Halt 0 0 0 00 > 35 Transaction 0 0 1 0 01 usesStmtJournal=0 > 36 Goto 0 1 0 00 > |5.76460752303424e+17 > sqlite> > > sqlite> SELECT * FROM t1 WHERE c1 == (SELECT c1 FROM t1); > QUERY PLAN > |--SEARCH TABLE t1 USING COVERING INDEX sqlite_autoindex_t1_1 (c1=?) (~10 > rows) > `--SCALAR SUBQUERY 1 > `--SCAN TABLE t1 (~1048576 rows) > addr opcode p1 p2 p3 p4 p5 comment > ---- ------------- ---- ---- ---- ------------- -- ------------- > 0 Init 0 35 0 00 Start at 35 > 1 OpenRead 2 3 0 k(3,,,) 02 root=3 iDb=0; > sqlite_autoindex_t1_1 > 2 ColumnsUsed 2 0 0 3 00 > 3 Explain 3 0 0 SEARCH TABLE t1 USING COVERING > INDEX sqlite_autoindex_t1_1 (c1=?) (~10 rows) 00 > 4 Noop 0 0 0 00 Begin > WHERE-loop0: t1 > 5 Integer 21 2 0 00 r[2]=21; return > address > 6 Once 0 21 0 00 > 7 Null 0 3 3 00 r[3..3]=NULL; > Init subquery result > 8 Integer 1 4 0 00 r[4]=1; LIMIT > counter > 9 OpenRead 1 2 0 2 00 root=2 iDb=0; t1 > 10 ColumnsUsed 1 0 0 2 00 > 11 Explain 11 0 0 SCAN TABLE t1 (~1048576 rows) 00 > 12 Noop 0 0 0 00 Begin > WHERE-loop0: t1 > 13 Rewind 1 20 0 00 > 14 Noop 0 0 0 00 Begin > WHERE-core > 15 Column 1 1 3 00 r[3]=t1.c1 > 16 RealAffinity 3 0 0 00 > 17 DecrJumpZero 4 21 0 00 if (--r[4])==0 > goto 21 > 18 Noop 0 0 0 00 End WHERE-core > 19 Next 1 14 0 01 > 20 Noop 0 0 0 00 End WHERE-loop0: > t1 > 21 Return 2 0 0 00 > 22 IsNull 3 33 0 00 if r[3]==NULL > goto 33 > 23 Affinity 3 1 0 E 00 affinity(r[3]) > 24 SeekGE 2 33 3 1 00 key=r[3] > 25 IdxGT 2 33 3 1 00 key=r[3] > 26 Noop 0 0 0 00 Begin > WHERE-core > 27 Column 2 1 5 00 r[5]=t1.c0 > 28 Column 2 0 6 00 r[6]=t1.c1 > 29 RealAffinity 6 0 0 00 > 30 ResultRow 5 2 0 00 output=r[5..6] > 31 Noop 0 0 0 00 End WHERE-core > 32 Next 2 25 0 00 > 33 Noop 0 0 0 00 End WHERE-loop0: > t1 > 34 Halt 0 0 0 00 > 35 Transaction 0 0 1 0 01 usesStmtJournal=0 > 36 Goto 0 1 0 00 > sqlite> > > > --- > The fact that there's a Highway to Hell but only a Stairway to Heaven says > a lot about anticipated traffic volume. > > > >-----Original Message----- > >From: sqlite-users [mailto:sqlite-users- > >[email protected]] On Behalf Of Manuel Rigger > >Sent: Saturday, 4 May, 2019 12:25 > >To: SQLite mailing list > >Subject: Re: [sqlite] Problem with REAL PRIMARY KEY > > > >Sorry, I should have anticipated that we get slightly different > >values. > >Shouldn't the query "SELECT * FROM t1 WHERE c1 IN (SELECT c1 FROM > >t1);" > >return a result though? > > > >Best, > >Manuel > > > >On Sat, May 4, 2019 at 8:17 PM Keith Medcalf <[email protected]> > >wrote: > > > >> > >> Ooopsie ... that should have been 1e17, and it appears to be fine, > >except > >> that: > >> > >> SELECT ALL * FROM t1 WHERE c1 = (select c1 from t1); > >> > >> does not work ever though the value returned from the subselect > >should be > >> exactly the value in the index ... > >> > >> A table scan does however work correctly ... > >> > >> sqlite> SELECT ALL * FROM t1 not indexed WHERE c1 = (select c1 from > >t1); > >> |5.76460752303423e+17 > >> > >> > >> --- > >> The fact that there's a Highway to Hell but only a Stairway to > >Heaven says > >> a lot about anticipated traffic volume. > >> > >> > >> >-----Original Message----- > >> >From: sqlite-users [mailto:sqlite-users- > >> >[email protected]] On Behalf Of Keith Medcalf > >> >Sent: Saturday, 4 May, 2019 12:09 > >> >To: SQLite mailing list > >> >Subject: Re: [sqlite] Problem with REAL PRIMARY KEY > >> > > >> > > >> >There is, however, something weird: > >> > > >> >SQLite version 3.29.0 2019-05-04 17:32:07 > >> >Enter ".help" for usage hints. > >> >Connected to a transient in-memory database. > >> >Use ".open FILENAME" to reopen on a persistent database. > >> >sqlite> .version > >> >SQLite 3.29.0 2019-05-04 17:32:07 > >> >c2e439bccc40825e211bfa9a88e6a251ff066ca7453d4e7cb5eab56ce733alt2 > >> >zlib version 1.2.11 > >> >gcc-8.1.0 > >> >sqlite> CREATE TABLE t1 (c0, c1 REAL, PRIMARY KEY (c1, c0)); > >> >sqlite> INSERT INTO t1(c1) VALUES (0X7ffffffffffffff);; > >> >sqlite> SELECT ALL * FROM t1 WHERE c1 = 5.76460752303423e+17; > >> >sqlite> SELECT ALL * FROM t1 WHERE c1 = (select c1 from t1); > >> >sqlite> SELECT ALL * FROM t1 WHERE c1 > (select c1 - 1 from t1); > >> >sqlite> select c1 from t1; > >> >5.76460752303423e+17 > >> >sqlite> select c1 - 1 from t1; > >> >5.76460752303423e+17 > >> >sqlite> > >> > > >> > > >> >--- > >> >The fact that there's a Highway to Hell but only a Stairway to > >Heaven > >> >says a lot about anticipated traffic volume. > >> > > >> > > >> >>-----Original Message----- > >> >>From: sqlite-users [mailto:sqlite-users- > >> >>[email protected]] On Behalf Of Richard Hipp > >> >>Sent: Saturday, 4 May, 2019 11:49 > >> >>To: SQLite mailing list > >> >>Subject: Re: [sqlite] Problem with REAL PRIMARY KEY > >> >> > >> >>On 5/4/19, Manuel Rigger <[email protected]> wrote: > >> >>> Hi everyone, > >> >>> > >> >>> Consider the following example: > >> >>> > >> >>> CREATE TABLE t1 (c0, c1 REAL, PRIMARY KEY (c1, c0)); > >> >>> INSERT INTO t1(c1) VALUES (0X7ffffffffffffff);; > >> >>> SELECT ALL * FROM t1 WHERE c1 = 5.76460752303423e+17; > >> >>> > >> >>> I would expect the row to be fetched, which is not the case. > >> >> > >> >>But 0x7ffffffffffffff != 5.76460752303423e+17. Try it: > >> >> > >> >> SELECT 0x7ffffffffffffff != 5.76460752303423e+17; > >> >> > >> >>You should get back 0. > >> >> > >> >>The rule of thumb is to never expect the == operator to give a > >> >>meaningful answer for floating-point numbers. Only use <, <=, >, > >> >and > >> >>>=. > >> >> > >> >>-- > >> >>D. Richard Hipp > >> >>[email protected] > >> >>_______________________________________________ > >> >>sqlite-users mailing list > >> >>[email protected] > >> >>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite- > >users > >> > > >> > > >> > > >> >_______________________________________________ > >> >sqlite-users mailing list > >> >[email protected] > >> >http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite- > >users > >> > >> > >> > >> _______________________________________________ > >> sqlite-users mailing list > >> [email protected] > >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite- > >users > >> > >_______________________________________________ > >sqlite-users mailing list > >[email protected] > >http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > > > _______________________________________________ > sqlite-users mailing list > [email protected] > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list [email protected] http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

