Hello,

I experienced seeing no results for search in matrix-syanpse backed by sqlite3 storage. Tracking down the their source code I identified the query: https://github.com/matrix-org/synapse/blob/v1.9.1/synapse/storage/data_stores/main/search.py#L424

I then run the query directly on a copy of the database getting the error in the subject. I run an integrity check on the fts and no error was reported.

To be sure I started from a new database, create the virtual table and inserted data to run the query on. Same result: sqlite> CREATE VIRTUAL TABLE event_search_test USING fts4 ( event_id, room_id, sender, key, value ); sqlite> INSERT INTO event_search_test VALUES('test','test','','test','a matching string');
sqlite> SELECT * FROM event_search_test WHERE value MATCH "string";
test|test||test|a matching string
sqlite> SELECT quote(matchinfo(event_search_test)) as rank, room_id, event_id, value FROM event_search_test WHERE value MATCH "string"; X'0100000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000100000001000000'|test|test|a matching string sqlite> SELECT rank(matchinfo(event_search_test)) as rank, room_id, event_id, value FROM event_search_test WHERE value MATCH "string";
Error: wrong number of arguments to function rank()



I'm running sqlite3 3.27.2 on a Debian 10 machine.
I looked at https://github.com/sqlite/sqlite/blob/version-3.27.2/src/test_func.c#L828 and I can see that the error is somehow related to the mismatching between the second unsinged 32bit integer in the matchinfo returned blob and the nVal in the rankfunc param (please, correct me if I'm wrong).

I don't know exactly which nVal value rankfunc receives, I can see that upon sqlite3_create_function call for the function it takes -1 as variable number of arguments.

I see that the nCol in my query is 5, so I expect nVal to have something like the value of the number of column in the fst table plus the hidden one: in this case the value would match, but this is clearly not the case in my test.

Similar test failed as well:
sqlite> CREATE VIRTUAL TABLE another_test USING fts4 (a_field, another_field);
sqlite> INSERT INTO another_test VALUES('test', 'test');
sqlite> SELECT * FROM another_test WHERE a_field MATCH "test";
test|test
sqlite> SELECT quote(matchinfo(another_test)) as rank, a_field FROM another_test WHERE a_field MATCH "test";
X'0100000002000000010000000100000001000000000000000000000000000000'|test
sqlite> SELECT rank(matchinfo(another_test)) as rank, a_field FROM another_test WHERE a_field MATCH "test";
Error: wrong number of arguments to function rank()


I cannot find any bug related to this problem, so I guess is somehow related to my env.

Thanks,
Andrea Spacca


_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to