I have full paths of a set of resources in a database, and am using
substrings to find arbitrary hierarchical resources. Worked fine on
Windows using Sqlite3 3.6.5, but on Linux with 3.5.9 the query fails.
The schema includes tables:
paths:(integer id, string path)
common_details:(integer path_id (fkey), string type, string name)
select p3.id, cd3.name, cd2.name, p2.path as p2, length(p1.path) as len_p1,
p1.path as p1, substr(p2.path, length(p1.path) + 1, 1) as p1Char
from paths as p1, paths as p2, paths as p3,
common_details as cd3, common_details as cd2, common_details as cd1
where cd1.name = "Abbreviations" and cd1.type = "folder"
and cd2.type = "folder" and (cd2.name like "Perl" or cd2.name like
"General")
and cd1.path_id = p1.id
and cd2.path_id = p2.id
and substr(p2.path, 1, length(p1.path)) = p1.path
and (substr(p2.path, length(p1.path) + 1, 1) == "/"
or substr(p2.path, length(p1.path) + 1, 1) != "/")
and cd3.type = "snippet" and cd3.name like "fore"
and cd3.path_id = p3.id
and substr(p3.path, 1, length(p2.path)) = p2.path ;
Notice the clause in the middle of the query:
and (substr(p2.path, length(p1.path) + 1, 1) = "/"
or substr(p2.path, length(p1.path) + 1, 1) != "/")
If I comment out this full clause, the query returns the expected result
set.
But if I leave it uncommented, the query returns an empty set. But the
clause
should be tautologically true -- either the character after the prefix is
"/" or it
isn't.
Looks like a bug to me. The code ran fine on Windows (where I used
only the '=' test, not the '!=' test. I do have a workaround -- it's to
return paths
in my result set and to the substring test in Python instead of sqlite. But
I'd prefer having sqlite run this code.
- Eric
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users