Re: [sqlite] I suspect not - but is the database separator configurable?
Hi Ryan, On 2/2/2013 1:55 AM, Ryan Johnson wrote: That would break sybase, though: the quotes would also tell it to treat the db name and periods as part of the table name, too: sqlite3> create table foo(x,y); sqlite3> .tables foo sqlite3> select * from "main.foo"; Error: no such table: main.foo Since the OP (you aren't the OP, right?) seems to have control over the code, I wonder if a compile-time macro could be used to attach the quotes around the database name only in the test environment. But, otherwise, I think we're at the end of what can be done with SQLite. Best Regards, Mohit. ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
[sqlite] fts4 contentless tables, multiple inserts to same doc id?
Is the following intended to be legal and possible for a contentless fts table: to do multiple inserts with the same docid, but to different columns? It seems to work, and I like it, but it wasn't entirely expected. sqlite> CREATE VIRTUAL TABLE t1 USING fts4(content="", a, b); sqlite> INSERT INTO t1(docid, a) VALUES (1, "avery"); sqlite> INSERT INTO t1(docid, b) VALUES (1, "billy"); sqlite> SELECT docid FROM t1 WHERE a MATCH 'avery'; 1 sqlite> SELECT docid FROM t1 WHERE b MATCH 'avery'; sqlite> SELECT docid FROM t1 WHERE b MATCH 'billy'; 1 sqlite> SELECT docid FROM t1 WHERE t1 MATCH 'billy'; 1 sqlite> SELECT docid FROM t1 WHERE t1 MATCH 'avery'; 1 Thanks, James ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] I suspect not - but is the database separator configurable?
On 01/02/2013 12:28 PM, Mohit Sindhwani wrote: Hi Marc, On 1/2/2013 10:42 PM, message adams wrote: My applications actually run against sybase, but I'd love to use a connection to an in-memory sqlite to carry out my testing. As part of the unit-test, I'd pass the sqlite conenction into my source code hoping it would be none the wiser. The only real problem I see, is sybase uses a double period separator between the database and table. e.g. select * from database..table ... whereas sqlite select * from database.table Can you use double quotes in the query? For example, this works in SQLite3 sqlite> create table "db..abc"(p INTEGER, q INTEGER); sqlite> .tables db..abc sqlite> select * from "db..abc"; sqlite> That would break sybase, though: the quotes would also tell it to treat the db name and periods as part of the table name, too: sqlite3> create table foo(x,y); sqlite3> .tables foo sqlite3> select * from "main.foo"; Error: no such table: main.foo Ryan ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] I suspect not - but is the database separator configurable?
Hi Marc, On 1/2/2013 10:42 PM, message adams wrote: My applications actually run against sybase, but I'd love to use a connection to an in-memory sqlite to carry out my testing. As part of the unit-test, I'd pass the sqlite conenction into my source code hoping it would be none the wiser. The only real problem I see, is sybase uses a double period separator between the database and table. e.g. select * from database..table ... whereas sqlite select * from database.table Can you use double quotes in the query? For example, this works in SQLite3 sqlite> create table "db..abc"(p INTEGER, q INTEGER); sqlite> .tables db..abc sqlite> select * from "db..abc"; sqlite> Best Regards, Mohit. ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Tracking changes with sha1 hashes
On 2/1/2013 10:21 AM, Amit Chaudhuri wrote: If I only issue select queries on my two input databases, can I expect the sha1 hash to stay the same over time? Yes. You can even mark the database file as read-only and use sqlite3_open_v2 with SQLITE_OPEN_READONLY flag. -- Igor Tandetnik ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] I suspect not - but is the database separator configurable?
On Fri, Feb 1, 2013 at 6:42 AM, message adamswrote: > Greetings; > > I've recently started using sqlite within Python, to help unit-test my > applications. > > My applications actually run against sybase, but I'd love to use a > connection to an in-memory sqlite to carry out my testing. > As part of the unit-test, I'd pass the sqlite conenction into my source > code hoping it would be none the wiser. > > The only real problem I see, is sybase uses a double period separator > between the database and table. e.g. > select * from database..table No, it's not double period separator. It's actually database.table_owner.table, but table_owner can be omitted, in that case it's defaulted to 'dbo'. > ... whereas sqlite > select * from database.table > > > I assume the sqlite database separator is not configurable, but was > wondering if anybody's resolved a similar issue? SQLite doesn't have a notion of users, thus it doesn't and won't support the "double period" separator. SQLite even has a different notion of databases that can go before table name. So to make queries work both in SQLite and in Sybase don't use database name at all, make it "select * from table". Pavel ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
[sqlite] I suspect not - but is the database separator configurable?
Greetings; I've recently started using sqlite within Python, to help unit-test my applications. My applications actually run against sybase, but I'd love to use a connection to an in-memory sqlite to carry out my testing. As part of the unit-test, I'd pass the sqlite conenction into my source code hoping it would be none the wiser. The only real problem I see, is sybase uses a double period separator between the database and table. e.g. select * from database..table ... whereas sqlite select * from database.table I assume the sqlite database separator is not configurable, but was wondering if anybody's resolved a similar issue? Many thanks for any help, Marc ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Possible optimization in FTS SQLite? (abort early when unpacking docids of inverted index list)
On 02/01/2013 08:31 PM, Dominique Pellé wrote: Hi I was trying to optimize this FTS query which can be a bottleneck in my application: SELECT docId,matchinfo(ftsStreets,'pcx') FROM ftsStreets WHERE ftsStreets MATCH '...' AND docId BETWEEN docid1 AND docid2; Can't SQLite optimize the query to use the fact that docid cannot be more than the specified upper limit (docid2) given in the BETWEEN clause here? Looking that the SQLite code (3.7.14), I see that it unpacks docid lists (in function fts3SegReaderNextDocid.c) of the FTS inverted index. Those docid lists are stored in ascending order and stored by delta. Each delta is stored in variable size (1 bytes to 10 bytes depending on size of delta). When running above query, I see that SQLite unpacks sequentially all the docids of the lists, even after it reaches beyond upper bound docid2, which seems useless at least in above query. It probably is possible to include an optimization like this. One problem will be the 'x' passed to the matchinfo() function. One of the values returned in this case is the number of rows in the entire table that contain at least one instance of a given query phrase. To obtain that information we have to iterate through the entire set of docids anyhow. Dan. I made a temporary change to sqlite3.c (function fts3SegReaderNextDocid.c) just to prove that there is a potential optimization here: $ p4 diff -d-c sqlite3.c *** *** 126024,126029 --- 126024,126030 }else{ rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX); if( rc==SQLITE_OK ){ + extern sqlite3_int64 docidMax; sqlite3_int64 iDelta; pReader->pOffsetList = p + sqlite3Fts3GetVarint(p,); if( pTab->bDescIdx ){ *** *** 126031,126036 --- 126032,126042 }else{ pReader->iDocid += iDelta; } + if ((unsigned long long)pReader->iDocid> (unsigned long long)docidMax) + { + fprintf(stdout, "*** MAX DOCID (0x%llx) REACHED! (abort unpack of docid list)\n", docidMax); + pReader->pOffsetList = 0; + } } } } The docidMax is normally initialized to 0xUL (-1), so my optimization normally do not do anything. But I set doidMax to docid2 (upper bound of the BETWEEN clause) temporarily when I run my query and then put it back to 0xUL. Needless to say that this is an ugly hack which should definitely not be checked-in as-is. But it clearly helps to speed up my query and it seems to work (without being 100% sure it's correct). I get the same results, faster. And I hope it's good enough at least to prove that there is a potential optimization in FTS SQLite. I don't know the SQLite code well enough to come up with a clean patch for the optimization. I measured timing several times and it consistently speeds up. For example, I see some queries that used to take 203 ms which now take 68 ms. Of course speed up depends on the upper bound value docid2. Regards Dominique ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] FTS4 languageid : not sure I understand this correctly
On Thu, Jan 31, 2013 at 3:18 PM, Gert Van Asschewrote: > All, > > I have the feeling this is the most stupid question ever, but... > If I create a FTS4 table, put text in it, could I use the languageid to > figure out what Language that text actually is? > Is that how langID works? > No. The languageID simply allows the same FTS4 table to hold separate and independent content for multiple languages. It is the same as having a separate table for each languange, except that with languageID you can choose which language in between sqlite3_prepare() and sqlite3_step() whereas with separate tables, you must make the choice prior to sqlite3_prepare(). That difference, though subtle, is very important for some applications. > I did some tests, but the LangID seems to be 0 all the time, so or I'm > doing something wrong, or I misunderstand the process. > > thanks > > gert > ___ > 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
Re: [sqlite] Sqlite query doesn't run correctly on different databases
Thanks Richard that worked On 1 February 2013 11:23, Richard Hippwrote: > The expression "x NOT IN (something-that-contains-NULL)" is always false. > I suggest you add an additional term to the WHERE clause of the subquery: > "... AND md5 NOT NULL". > > On Fri, Feb 1, 2013 at 6:20 AM, Paul Sanderson < > sandersonforens...@gmail.com > > wrote: > > > I have a query > > > > SELECT * FROM rtable WHERE md5 NOT IN (SELECT md5 FROM rtable WHERE vsc = > > 0) > > > > I have a test data set > > > > sqlite> select * from rtable; > > $RmMetadata|0|8465-CEEF-126A-0F04-1EDC-1D7B-331F-9279 > > $RmMetadata|1|8465-CEEF-126A-0F04-1EDC-1D7B-331F-9279 > > $RmMetadata|2|8465-CEEF-126A-0F04-1EDC-1D7B-331F-9279 > > $RmMetadata|3|B2F9-B5D4-A427-9FE2-9724-BF95-1571-7CE5 > > $RmMetadata|4|0546-4667-5A69-6478-FC97-6F27-840D-7D62 > > $RmMetadata|5|0546-4667-5A69-6478-FC97-6F27-840D-7D62 > > $RmMetadata|6|0546-4667-5A69-6478-FC97-6F27-840D-7D62 > > $RmMetadata|7|01EE-7E2E-2242-E734-B125-D02F-A7F0-DC29 > > $RmMetadata|8|01EE-7E2E-2242-E734-B125-D02F-A7F0-DC29 > > > > When I execute the above query on my test dataset all works OK. These > rows > > are a subset (some of the columns and some of the rows) of a real > dataset. > > > > However I also have a real dataset where the query returns no rows (and > it > > should). The real dataset has indexes on all of the relevant columns. The > > only differences I can think of with the real dataset are that there are > > rows where MD5 is null, and that I have added a custom collation > > (SYSTEMNOCASE) for some text columns (although MD5 is a text column the > > data in it will only ever by capitals so the collation is not used on > this > > column). > > > > Any ideas what the problem could be? > > ___ > > 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 > -- Paul www.sandersonforensics.com skype: r3scue193 twitter: @sandersonforens Tel +44 (0)1326 572786 ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Determine if an index has been created
On 1 Feb 2013, at 10:12am, Paul Sandersonwrote: > I will know the name of the index - I just need to check that it has been > created. Oh, in that case just submit the 'CREATE' command. If the index already exists you'll get an error result and nothing will be done. If the index doesn't exist, it'll be created. Simon. ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Sqlite query doesn't run correctly on different databases
The expression "x NOT IN (something-that-contains-NULL)" is always false. I suggest you add an additional term to the WHERE clause of the subquery: "... AND md5 NOT NULL". On Fri, Feb 1, 2013 at 6:20 AM, Paul Sandersonwrote: > I have a query > > SELECT * FROM rtable WHERE md5 NOT IN (SELECT md5 FROM rtable WHERE vsc = > 0) > > I have a test data set > > sqlite> select * from rtable; > $RmMetadata|0|8465-CEEF-126A-0F04-1EDC-1D7B-331F-9279 > $RmMetadata|1|8465-CEEF-126A-0F04-1EDC-1D7B-331F-9279 > $RmMetadata|2|8465-CEEF-126A-0F04-1EDC-1D7B-331F-9279 > $RmMetadata|3|B2F9-B5D4-A427-9FE2-9724-BF95-1571-7CE5 > $RmMetadata|4|0546-4667-5A69-6478-FC97-6F27-840D-7D62 > $RmMetadata|5|0546-4667-5A69-6478-FC97-6F27-840D-7D62 > $RmMetadata|6|0546-4667-5A69-6478-FC97-6F27-840D-7D62 > $RmMetadata|7|01EE-7E2E-2242-E734-B125-D02F-A7F0-DC29 > $RmMetadata|8|01EE-7E2E-2242-E734-B125-D02F-A7F0-DC29 > > When I execute the above query on my test dataset all works OK. These rows > are a subset (some of the columns and some of the rows) of a real dataset. > > However I also have a real dataset where the query returns no rows (and it > should). The real dataset has indexes on all of the relevant columns. The > only differences I can think of with the real dataset are that there are > rows where MD5 is null, and that I have added a custom collation > (SYSTEMNOCASE) for some text columns (although MD5 is a text column the > data in it will only ever by capitals so the collation is not used on this > column). > > Any ideas what the problem could be? > ___ > 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
Re: [sqlite] Determine if an index has been created
Thank You On 1 February 2013 10:38, Roger Binnswrote: > -BEGIN PGP SIGNED MESSAGE- > Hash: SHA1 > > On 01/02/13 02:12, Paul Sanderson wrote: > > I will know the name of the index - I just need to check that it has > > been created. > > Just use pragma index_info on the index name. If it doesn't exist then > you get no rows returned and if it does exist then you a row per column in > the index. > > Roger > > -BEGIN PGP SIGNATURE- > Version: GnuPG v1.4.11 (GNU/Linux) > > iEYEARECAAYFAlELmyUACgkQmOOfHg372QSkCwCgvIzw59DcPMytdRssRs37YPRB > IUMAoKmyDMkKhdubaMqdmp/H9WLrkYAW > =WCNM > -END PGP SIGNATURE- > ___ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > -- Paul www.sandersonforensics.com skype: r3scue193 twitter: @sandersonforens Tel +44 (0)1326 572786 ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Determine if an index has been created
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 01/02/13 02:12, Paul Sanderson wrote: > I will know the name of the index - I just need to check that it has > been created. Just use pragma index_info on the index name. If it doesn't exist then you get no rows returned and if it does exist then you a row per column in the index. Roger -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.11 (GNU/Linux) iEYEARECAAYFAlELmyUACgkQmOOfHg372QSkCwCgvIzw59DcPMytdRssRs37YPRB IUMAoKmyDMkKhdubaMqdmp/H9WLrkYAW =WCNM -END PGP SIGNATURE- ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Determine if an index has been created
I will know the name of the index - I just need to check that it has been created. On 1 February 2013 00:09, Simon Slavinwrote: > > On 31 Jan 2013, at 10:57pm, Igor Tandetnik wrote: > > > On 1/31/2013 5:45 PM, Paul Sanderson wrote: > >> Is it possible to ascertain if an index on a particular column has > already > >> been created. > > > > PRAGMA index_list(YourTable), then for each index, PRAGMA > index_info(IndexName) > > But note that one index can be on any number of columns. In fact if you > have long SELECT statements you probably have long indexes too. So do you > want to know if you have an index on just that one column, or if you have > any indexes which include that column ? > > Simon. > ___ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > -- Paul www.sandersonforensics.com skype: r3scue193 twitter: @sandersonforens Tel +44 (0)1326 572786 ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
[sqlite] Peter Aronson
http://google.com ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] SELECT and UPDATE in single query
> If you want to know which rows were updated regardless of the key, what > you need is a column to hold a unique value for each update transaction, > and set it as part of the UPDATE. You could add a datetime column, > for example, if the time resolution is fine enough. Good idea. I found setting the status column to epoch was considerably faster: epoch = int(datetime.datetime.now().strftime('%s%f')) conn.execute('UPDATE queue SET status=? WHERE key in (SELECT key FROM queue WHERE status=? LIMIT ?);', (epoch, 0, limit)) rows = conn.execute('SELECT key FROM queue WHERE status=?', (epoch,)) ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users