Hi Oliver,
Can't answer your broader question, but I suspect the reason you are
seeing "No query Unable to fetch row" - error code: "" is because you
are not checking for an error after the prepare. Hopefully, you will
then the expected 'no such function' error and can act on it accordingly.
Regards,
Tony
On 25/10/2022 4:58 am, Till Oliver Knoll wrote:
Dear all,
What is the least complicated way to enable the math functions that
come with SQLite, when it is compiled with the
-DSQLITE_ENABLE_MATH_FUNCTIONS switch?
My empirical experiments with the binary Qt 5.15.2 (open source)
release (but also some tests with the lastest Qt 6.4 binary release,
for either Windows or macOS) suggest that the SQLite plugin that ships
with Qt does not enable those "built in mathematical functions", as
described here:
https://www.sqlite.org/lang_mathfunc.html
So do I:
* Recompile the Qt SQLite plugin, with the desired
-DSQLITE_ENABLE_MATH_FUNCTIONS flag?
o Disadvantages (?):
+ Need to download Qt source code
+ Probably complicates the build process... (I have "build
actions" on github.com that currently "only" need to
install the binary Qt distribution)
+ Feels a bit "overkill"
* Try to get the "SQLite DB handle" and add my own sin(), cos() and
power() functions?
o As described here:
https://forum.qt.io/topic/71210/sqlite-user-define-functions/3
+ Essentially "QSqlDatabase::driver->handle()", some voodoo
casting and using sqlite3_create_function()
o Advantages:
+ Probably can be achieved using the "stock" SQLite plugin
that ships with Qt, "programatically"
o Disadvantages (?):
+ Still need to get hold of some SQLite header (for
sqlite_create_function etc.)
+ Fragile? What if the header mismatches (in the future)
with the shipped Qt SQLite plugin?
# Feels "hacky"...
* Any other "trick" to add those "math extensions" to an existing Qt
SQLite plugin?
The second option seems more attractive than the first, but
nevertheless a bit "fragile" (and I have to add functions that would
essentially "already be in SQLite" (if enabled & compiled)), so feels
like "re-inventing the wheel"...
Some more details: specifically I am trying to execute a query like:
*select power(l.latitude - 48.0, 2) + power((l.longitude - 8.0) *
cos(radians( 48.0 )), 2) dist ****from location l;*
(Eventually I want to find locations given by their latitude and
longitude that are within a certain distance of my given location:
https://jonisalonen.com/2014/computing-distance-between-coordinates-can-be-simple-and-fast/)
However when compiled into my Qt 5.15.2 application with some current
"test code" like:.
QSqlQueryquery1;
query1.setForwardOnly(true);
query1.prepare(
"selectpower(l.latitude-48.0,2)+power((l.longitude-8.0)*cos(radians(48.0)),2)dist"
"from location l;"
);
constboolsuccess=query1.exec();
if(success){
...
}else{
qDebug()<<"SQL error:"<<query1.lastError().text()<<"- error
code:"<<query1.lastError().nativeErrorCode();
}
I get:
SQL error: "No query Unable to fetch row" - error code: ""
When executing the equivalent query in the Qt example app "Qt SQL
Browser" (this time compiled with Qt 6.4) (which provides a Movies and
Names table):
select power(l.latitude - 48.0, 2) + power((l.longitude - 8.0) *
cos(radians( 48.0 )), 2) dist from movies l;
then I get a more meaningful (and expected) error message:
"no such function: power Unable to exectute statement"
Conclusion: "No math support in the shipped SQLite plugin, neither in
Qt 5.15.2 (Windows nor macOS) nor Qt 6.4 (again tried both Windows and
macOS).
Now when I execute my first query in the app "DB Browser for SQLite
(https://sqlitebrowser.org/), against my own database schema (with a
"location" table) again:
select power(l.latitude - 48.0, 2) + power((l.longitude - 8.0) *
cos(radians( 48.0 )), 2) dist from location l;
I intially also get "no such function: power". However DB Browser for
SQLite provides the possibility to add "extensions", such as (on macOS);
/Applications/DB Browser for SQLite.app/Contents/Extensions/math.dylib
(To be registered via Preferences or loaded via Tool / Load Extension...)
Now with this "math" extension loaded (I assume this is some DB
Browser for SQLite specific plugin / extension) my query works as
expected (even with the somewhat older SQLite 3.35.x). So this goes to
illustrate that my query is not completely wrong (syntactically)...
So any ideas how to "enable math support" in either the shipped Qt
SQLite plugin, and/or how to (re-)compile that plugin with the least
effort, or any other tricks how to make use of "sin, cos, power and
friends" in SQLite are very welcome. Interestingly I did not find any
such questions in the Qt interest forums, and some stackoverflow
answers seem indeed to suggest to use sqlite3_create_function()
Thanks,
Oliver
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest