Compiling spellfix for sqlite3

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
21 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Compiling spellfix for sqlite3

Mirat Bayrak
I needed wanted to build "did you mean this?" feature to my website. I'm
using sqlite3 and learned that i can use spellfix module to order tables
via levenstein.

I downloaded source code of
sqlite3<http://www.sqlite.org/2013/sqlite-src-3071700.zip> and
compiled spellfix.c (it's inside /ext/misc/) like this:

gcc -shared -fPIC -Wall -I/tmp/sqlite-src-3071700/ spellfix.c -o spellfix

It compiles successfuly but when i load it into sqlite:

sqlite> .load ./spellfix

I'm getting this error:

Error: ./spellfix: undefined symbol: sqlite3_extension_init

I really have very few knowledge about compiling c programs. Did i do some
mistake about compiling or something else is happened? What should i do?
_______________________________________________
sqlite-users mailing list
[hidden email]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Keith Medcalf
> I downloaded source code of and compiled spellfix.c (it's inside /ext/misc/) like this:
 
> gcc -shared -fPIC -Wall -I/tmp/sqlite-src-3071700/ spellfix.c -o spellfix

> It compiles successfuly but when i load it into sqlite:
 
> sqlite> .load ./spellfix
 
> I'm getting this error:
 
> Error: ./spellfix: undefined symbol: sqlite3_extension_init
 
> I really have very few knowledge about compiling c programs. Did i do
> some mistake about compiling or something else is happened? What should i do?

The init function name is sqlite3_spellfix_init

Current versions of sqlite3 should look for this name as well as the older generic name by default.  You can specify the entrypoint name on your .load command (or in the call to sqlite3_load_extension).

You can also simply append the spellfix.c (or any or all of the extensions) to the amalgamation code then add some code like this after that (all into the one amalgamation source file):

int core_init(const char* dummy)
{
    int nErr = 0;

    nErr += sqlite3_auto_extension((void*)sqlite3_ieee_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_nextchar_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_percentile_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_regexp_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_rot_init);

#ifndef SQLITE_OMIT_VIRTUALTABLE
    nErr += sqlite3_auto_extension((void*)sqlite3_vtshim_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_amatch_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_closure_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_fuzzer_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_spellfix_init);
    nErr += sqlite3_auto_extension((void*)sqlite3_wholenumber_init);
#endif

    return nErr ? SQLITE_ERROR : SQLITE_OK;
}

Then add the following define when you compile the amalgamation to add the core_init function to the library initialization sequence.

-DSQLITE_EXTRA_INIT=core_init

So for example, you can append all the /ext/misc extensions to the end of the amalgamation, add the above code at the end after that, set the additional define when compiling, and your new sqlite3 engine will have all the extensions compiled in and available in every connection.




_______________________________________________
sqlite-users mailing list
[hidden email]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Richard Hipp-3
In reply to this post by Mirat Bayrak
On Sun, Aug 25, 2013 at 6:25 AM, Mirat Bayrak <[hidden email]>wrote:

> I needed wanted to build "did you mean this?" feature to my website. I'm
> using sqlite3 and learned that i can use spellfix module to order tables
> via levenstein.
>
> I downloaded source code of
> sqlite3<http://www.sqlite.org/2013/sqlite-src-3071700.zip> and
> compiled spellfix.c (it's inside /ext/misc/) like this:
>
> gcc -shared -fPIC -Wall -I/tmp/sqlite-src-3071700/ spellfix.c -o spellfix
>
> It compiles successfuly but when i load it into sqlite:
>
> sqlite> .load ./spellfix
>
> I'm getting this error:
>
> Error: ./spellfix: undefined symbol: sqlite3_extension_init
>

You can specify the name of the entry point as a second argument:

    .load ./spellfix sqlite3_spellfix_init

The error you are getting is because SQLite is trying to use the entry
point name "sqlite3_extension_init" which is not exported by the "spellfix"
module.

SQLite will normally guess the right entry point name, if you are using a
recent version of SQLite and you name your shared library
"libspellfix.so".  I'm not sure if it can guess the right name with the
shared library being called just "spellfix" or not.  I think I would
definitely want to add the ".so" suffix at least.  But it never hurts to
play it safe and specify the entry point name explicitly.


>
> I really have very few knowledge about compiling c programs. Did i do some
> mistake about compiling or something else is happened? What should i do?
> _______________________________________________
> sqlite-users mailing list
> [hidden email]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>



--
D. Richard Hipp
[hidden email]
_______________________________________________
sqlite-users mailing list
[hidden email]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

curmudgeon
This post was updated on .
In reply to this post by Keith Medcalf
Keith, I know this is an old post but it refers to something we discussed recently.

I tried the following

I added the #include "carray.c" line to just above the bottom of the amalgamation such that the last few lines are

#include "carray.c"

#endif /* SQLITE_CORE */
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */

/************** End of stmt.c ************************************************/



I then added the following code to the end of carray.c

int core_init(const char* dummy)
{
        int nErr = 0;

        nErr += sqlite3_auto_extension((void*)sqlite3_carray_init);

        return nErr ? SQLITE_ERROR : SQLITE_OK;
}

-DSQLITE_CORE
-DSQLITE_EXTRA_INIT=core_init


Everything compiled OK but when I tried to access carray in a query I got a "no such table" error. To be honest I had no idea where to put what and, through debugging, I know the core_init function was never entered. Can you tell me where I'm going wrong?
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Keith Medcalf

You have to add the carray.c and core_init functions right at the end of the file (not inside any other code blocks).

The way you have it the carray.c is included only if SQLITE_ENABLE_STMTVTAB is enabled.

So it should look like this:

#endif /* SQLITE_CORE */
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */

/************** End of stmt.c
************************************************/

#include carray.c

>
>
>I then added the following code to the end of carray.c
>
>int core_init(const char* dummy)
>{
> int nErr = 0;
>
> nErr += sqlite3_auto_extension((void*)sqlite3_carray_init);
>
> return nErr ? SQLITE_ERROR : SQLITE_OK;
>}
>

These are specified as defines to the compiler correct?  I don't think that the -DSQLITE_CORE is required because technically the amalgamation sqlite3.c defines it automatically ... I just specify it for the greater certainty.

-DSQLITE_CORE
-DSQLITE_EXTRA_INIT=core_init


---
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-
>[hidden email]] On Behalf Of curmudgeon
>Sent: Monday, 21 August, 2017 09:13
>To: [hidden email]
>Subject: Re: [sqlite] Compiling spellfix for sqlite3
>
>Keith, I know this is an old post but it refers to something we
>discussed
>recently.
>
>I tried the following
>
>I added the #include carray.c line to just above the bottom of the
>amalgamation such that the last few lines are
>
>#include carray.c
>
>#endif /* SQLITE_CORE */
>#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
>
>/************** End of stmt.c
>************************************************/
>
>
>
>I then added the following code to the end of carray.c
>
>int core_init(const char* dummy)
>{
> int nErr = 0;
>
> nErr += sqlite3_auto_extension((void*)sqlite3_carray_init);
>
> return nErr ? SQLITE_ERROR : SQLITE_OK;
>}
>
>-DSQLITE_CORE
>-DSQLITE_EXTRA_INIT=core_init
>
>
>Everything compiled OK but when I tried to access carray in a query I
>got a
>"no such table" error. To be honest I had no idea where to put what
>and,
>through debugging, I know the core_init function was never entered.
>Can you
>tell me where I'm going wrong?
>
>
>
>
>--
>View this message in context:
>http://sqlite.1065341.n5.nabble.com/Compiling-spellfix-for-sqlite3-
>tp70656p97003.html
>Sent from the SQLite mailing list archive at Nabble.com.
>_______________________________________________
>sqlite-users mailing list
>[hidden email]
>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

curmudgeon
Thanks Keith. I followed your instructions but I'm now getting the following compiler errors

[bcc32 Error] carray.c(412): E2342 Type mismatch in parameter 'xInit' (wanted 'void (*)()', got 'void *')
// on the 'nErr += sqlite3_auto_extension((void*)sqlite3_carray_init); line'

[bcc32 Error] carray.c(430): E2040 Declaration terminated incorrectly
// on the '-DSQLITE_EXTRA_INIT=core_init' line

I assume carray.c wasn't being compiled at all the other way and that's why there were no errors reported. I tried wrapping the carray.c code in extern "C" {...carray.c code...} in case it was something to do with that but then I got a 'Declaration terminated incorrectly' error on the first line which contains extern "C" {
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Keith Medcalf

On Monday, 21 August, 2017 11:44, curmudgeon wrote:

>Thanks Keith. I followed your instructions but I'm now getting the
>following compiler errors

>[bcc32 Error] carray.c(412): E2342 Type mismatch in parameter 'xInit'
>(wanted 'void (*)()', got 'void *')
>// on the 'nErr +=
>sqlite3_auto_extension((void*)sqlite3_carray_init); line'

This is because you are compiling with a C++ compiler and C++ is picky about types (or your compiler is too picky about types when processing C files).  In C, a void* can be used anywhere for anything -- it is a completely generic pointer -- and you are supposed to know what you are doing if you use one (since there is actually no such thing as a "void" that can be pointed at).

You need to change the cast to the expected type:

nErr += sqlite3_auto_extension((void(*)())sqlite3_carray_init);


>[bcc32 Error] carray.c(430): E2040 Declaration terminated incorrectly
>// on the '-DSQLITE_EXTRA_INIT=core_init' line

This is because these are compiler directives and do not go in the source code.  They are defines that you pass to the compiler as command line arguments.  IE, to have the equivalent of "#define SQLITE_EXTRA_INIT core_init" in effect before the sqlite3.c is compiled.  If your compiler has a hooey-gooey, then there is some place in it for you to create defines.  You need to define SQLITE_EXTRA_INIT=core_init.

>I assume carray.c wasn't being compiled at all the other way and
>that's why there were no errors reported. I tried wrapping the
>carray.c code in extern "C" {...carray.c code...} in case it was
>something to do with that but then I got a 'Declaration terminated
>incorrectly' error on the first line which contains extern "C" {

Yeah.  Compiling C code in C++ mode is a dogs breakfast.  Actually, if sqlite3.c is being processed as C++ code I am surprised you are not getting billions of errors because many of the rules for incomplete types are different in C++ vs C.  When compiling C code the compiler you are using must be  half-way C compliant and half-way C++ compliant ...





_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

curmudgeon
Your cast did the trick Keith and it compiled fine once I removed the '-DSQLITE_EXTRA_INIT=core_init' line but I have no idea how to get that directive into the c++ builder application. I've put up a question on the c++ builder forum but unanswered as yet.
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Keith Medcalf

On Tuesday, 22 August, 2017 09:30, curmudgeon <[hidden email]> wrote:

>Your cast did the trick Keith and it compiled fine once I removed the
>'-DSQLITE_EXTRA_INIT=core_init' line but I have no idea how to get
>that directive into the c++ builder application. I've put up a question
>on the c++ builder forum but unanswered as yet.

Yeah, it must be in there somewhere.  Can't help though as I have a deadly allergy to IDE's.

In a non-GUI you would specify it as a command line option to the compiler (actually, to the pre-processor), as in:

gcc -DSQLITE_EXTRA_INIT=core_init sqlite3.c

---
The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume.




_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

curmudgeon
This post was updated on .
Keith, I finally managed to use carray this morning. The C++ builder IDE had a facility for entering conditional defines in Project|Options. I had noticed this before asking the question on the c++ builder forum but hadn't realised the -D part of -DSQLITE_EXTRA_INIT=cor_init wasn't required.

Thanks for all your help but would you mind if I haunted you just a little bit longer to clear something up?

You sent me an email with SampleExts.zip and wrote

When I build my sqlite3.dll (on windows with gcc) I get the following functions for every connection:

collation_list row = (0, u'ROT13')
collation_list row = (1, u'NUMERICS')
...

pragma_function_list() row= (u'aavg', 0)
pragma_function_list() row= (u'abs', 1)
pragma_function_list() row= (u'acos', 0)
....

I don't recognise the above 'list' notation and could find nothing on it when googled. Could you point me to any documentation as I would like to add some functions/collations that would be automatically attached to every database connection. I was wondering if I could just define the functions I always want present (appended to the amalgamation) and register them in the core_init function but I can't do that without knowing the sqlite3* to attach them to.

Edit: Ignore the above. Having looked at compress.c I see it's just a couple of functions. I was wrongly thinking these extensions were all virtual tables. I now assume I can just create a file with all my functions and collations similar to compress.c. In fact I suupose I could just stick them in compress.c if I was lazy?  



Keith Medcalf wrote
On Tuesday, 22 August, 2017 09:30, curmudgeon <[hidden email]> wrote:

>Your cast did the trick Keith and it compiled fine once I removed the
>'-DSQLITE_EXTRA_INIT=core_init' line but I have no idea how to get
>that directive into the c++ builder application. I've put up a question
>on the c++ builder forum but unanswered as yet.

Yeah, it must be in there somewhere.  Can't help though as I have a deadly allergy to IDE's.

In a non-GUI you would specify it as a command line option to the compiler (actually, to the pre-processor), as in:

gcc -DSQLITE_EXTRA_INIT=core_init sqlite3.c

---
The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume.




_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Keith Medcalf

Excellent!

That format is because the program that gets them is written in Python and the "list" format is the native "tuple" output format of Python (for the returned row objects).  For example, if in the command line shell you issue this command:

SQLite version 3.21.0 2017-08-21 02:20:57
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> select name as function_name, builtin from pragma_function_list() group by name collate nocase, builtin order by name collate nocase asc, builtin desc;
aavg|0
abs|1
acos|0
aggmd2|0
aggmd4|0
aggmd5|0
aggsha1|0
aggsha256|0
aggsha2_256|0

which is the table-valued function version of this:

sqlite> pragma function_list;
group_concat|1
group_concat|1
julianday|1
julianday|1
nullif|1
nullif|1
sqlite_compileoption_get|1
sqlite_compileoption_get|1
current_timestamp|1
current_timestamp|1
sqlite_compileoption_used|1
sqlite_compileoption_used|1



But in Python (with the standard dbapi module) if I execute something like (cn is the database connection object):

    for row in cn.cursor().execute('select name as function_name, builtin from pragma_function_list() group by name collate nocase, builtin order by name collate nocase asc, builtin desc;'):
        print('pragma_function_list() row=', row)

the printed output looks like this:

pragma_function_list() row= (u'aavg', 0)
pragma_function_list() row= (u'abs', 1)
pragma_function_list() row= (u'acos', 0)
pragma_function_list() row= (u'aggmd2', 0)
pragma_function_list() row= (u'aggmd4', 0)
pragma_function_list() row= (u'aggmd5', 0)
pragma_function_list() row= (u'aggsha1', 0)
pragma_function_list() row= (u'aggsha256', 0)
pragma_function_list() row= (u'aggsha2_256', 0)
pragma_function_list() row= (u'aggsha2_384', 0)
pragma_function_list() row= (u'aggsha2_512', 0)
pragma_function_list() row= (u'aggsha384', 0)
pragma_function_list() row= (u'aggsha3_224', 0)


The pragma's are documented on the SQLite3 documentation pages.
https://sqlite.org/pragma.html

pragma function_list;
pragma module_list;
pragma pragma_list;

are new in SQLite3 3.20.0 if you compile the amalgamation with SQLITE_INTROSPECTION_PRAGMAS defined.


---
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-
>[hidden email]] On Behalf Of curmudgeon
>Sent: Wednesday, 23 August, 2017 02:55
>To: [hidden email]
>Subject: Re: [sqlite] Compiling spellfix for sqlite3
>
>Keith, I finally managed to use carray this morning. The C++ builder
>IDE had
>a facility for entering conditional defines in Project|Options. I had
>noticed this before asking the question on the c++ builder forum but
>hadn't
>realised the -D part of -DSQLITE_EXTRA_INIT=cor_init wasn't required.
>
>Thanks for all your help but would you mind if I haunted you just a
>little
>bit longer to clear something up?
>
>You sent me an email with SampleExts.zip and wrote
>
>When I build my sqlite3.dll (on windows with gcc) I get the following
>functions for every connection:
>
>collation_list row = (0, u'ROT13')
>collation_list row = (1, u'NUMERICS')
>...
>
>pragma_function_list() row= (u'aavg', 0)
>pragma_function_list() row= (u'abs', 1)
>pragma_function_list() row= (u'acos', 0)
>....
>
>I don't recognise the above 'list' notation and could find nothing on
>it
>when googled. Could you point me to any documentation as I would like
>to add
>some functions/collations that would be automatically attached to
>every
>database connection.
>
>
>
>
>Keith Medcalf wrote
>> On Tuesday, 22 August, 2017 09:30, curmudgeon &lt;
>
>> tam118118@
>
>> &gt; wrote:
>>
>>>Your cast did the trick Keith and it compiled fine once I removed
>the
>>>'-DSQLITE_EXTRA_INIT=core_init' line but I have no idea how to get
>>>that directive into the c++ builder application. I've put up a
>question
>>>on the c++ builder forum but unanswered as yet.
>>
>> Yeah, it must be in there somewhere.  Can't help though as I have a
>deadly
>> allergy to IDE's.
>>
>> In a non-GUI you would specify it as a command line option to the
>compiler
>> (actually, to the pre-processor), as in:
>>
>> gcc -DSQLITE_EXTRA_INIT=core_init sqlite3.c
>>
>> ---
>> The fact that there's a Highway to Hell but only a Stairway to
>Heaven says
>> a lot about anticipated traffic volume.
>>
>>
>>
>>
>> _______________________________________________
>> sqlite-users mailing list
>
>> sqlite-users@.sqlite
>
>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-
>users
>
>
>
>
>
>--
>View this message in context:
>http://sqlite.1065341.n5.nabble.com/Compiling-spellfix-for-sqlite3-
>tp70656p97036.html
>Sent from the SQLite mailing list archive at Nabble.com.
>_______________________________________________
>sqlite-users mailing list
>[hidden email]
>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

curmudgeon
Thanks for the explanation Keith and the help. I've learned a lot the last few days.
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Dominique Devienne
In reply to this post by Keith Medcalf
On Wed, Aug 23, 2017 at 6:11 PM, Keith Medcalf <[hidden email]> wrote:

>
> sqlite> pragma function_list;
> group_concat|1
> group_concat|1
> julianday|1
> julianday|1
> nullif|1
> nullif|1
> sqlite_compileoption_get|1
> sqlite_compileoption_get|1
> current_timestamp|1
> current_timestamp|1
> sqlite_compileoption_used|1
> sqlite_compileoption_used|1
>

Where's that pragma from Keith? Thanks, --DD

There's no such pragma at https://sqlite.org/pragma.html
and below you can see it's just as good as another, which pragma happily
ignores.

I've requested at least twice on this list for this pragma to be added, so
of course you picked my interested.
Given all the other pragmas to introspect SQLite, I'm still baffled SQLite
doesn't have this one.

If it was a security concern, there are ways to mitigate it IMHO
(authorizer, register "hidden" functions, etc...).

C:\Users\ddevienne>sqlite3
SQLite version 3.10.2 2016-01-20 15:27:19
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> pragma function_list;
sqlite> pragma foobar;
sqlite>
_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Keith Medcalf
On Wednesday, 23 August, 2017 16:28, Dominique Devienne <[hidden email]> wrote:

>On Wed, Aug 23, 2017 at 6:11 PM, Keith Medcalf <[hidden email]> wrote:

>> sqlite> pragma function_list;
>> group_concat|1
>> group_concat|1
>> julianday|1
>> julianday|1
>> nullif|1
>> nullif|1
>> sqlite_compileoption_get|1
>> sqlite_compileoption_get|1
>> current_timestamp|1
>> current_timestamp|1
>> sqlite_compileoption_used|1
>> sqlite_compileoption_used|1

>Where's that pragma from Keith? Thanks, --DD

>There's no such pragma at https://sqlite.org/pragma.html
>and below you can see it's just as good as another, which pragma
>happily ignores.

They were added "experimentally" on July 7, 2017 -- meaning they do not show up in the documentation yet, and presumably that the implementation may change (and may currently be perhaps a little buggy or inconsistent -- if it breaks you own both halves when you use undocumented/pre-release features).  

You will note that for example the returned rows show both the builtin and user-defined function names, even though one may be overriding the other in various circumstances, and also no differentiation between scalar functions, aggregates, and no flags or argument numbers/types.  However if all you are looking for is whether or not a certain module or function is loaded (by name) on a connection then it returns that information.  Anything more specific is not returned though -- so you have to assume that the function you want is the one you see.

They appeared in the 3.20.0 release code although turned off by default -- you need to "build your own" with the preprocessor symbol SQLITE_INTROSPECTION_PRAGMAS defined.

The commit to trunk can be found here:

https://www.sqlite.org/src/info/e0b6ae92adfae46f

---
The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume.





_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Dominique Devienne
On Thu, Aug 24, 2017 at 1:24 AM, Keith Medcalf <[hidden email]> wrote:

> >On Wed, Aug 23, 2017 at 6:11 PM, Keith Medcalf <[hidden email]>
> wrote:
> >Where's that pragma from Keith? Thanks, --DD
>
> They were added "experimentally" on July 7, 2017


Oh cool, that's great! thanks for the heads-up.


> You will note that for example the returned rows show both the builtin and
> user-defined function names,

even though one may be overriding the other in various circumstances,

and also no differentiation between scalar functions, aggregates, and no
> flags or argument numbers/types.


I hope this is added eventually, fwiw. All that info exists in the
in-memory data-model,
so there's no reason the evtable wouldn't expose it IMHO. Then again, I've
thought for years
there's no reason SQLite didn't have this pragma either, so who knows
if/when that might come :)


> They appeared in the 3.20.0 release code although turned off by default --

you need to "build your own" with the preprocessor symbol
> SQLITE_INTROSPECTION_PRAGMAS defined.
>
> The commit to trunk can be found here:
> https://www.sqlite.org/src/info/e0b6ae92adfae46f


Thanks again for the detailed info. Cheers, --DD
_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

curmudgeon
In reply to this post by Keith Medcalf
While testing I appended the following code to the end of sqlite3.c.

#include "csv.c"
#include "stmt.c"
#include "compress.c"
#include "eval.c"
#include "carray.c"

int core_init(const char* dummy)
{
        int nErr = 0;
        nErr += sqlite3_auto_extension((void(*)())sqlite3_compress_init);
        nErr += sqlite3_auto_extension((void(*)())sqlite3_eval_init);
#ifndef SQLITE_OMIT_VIRTUALTABLE
        nErr += sqlite3_auto_extension((void(*)())sqlite3_csv_init);
        nErr += sqlite3_auto_extension((void(*)())sqlite3_stmt_init);
        nErr += sqlite3_auto_extension((void(*)())sqlite3_carray_init);
#endif
        return nErr ? SQLITE_ERROR : SQLITE_OK;
}


My compiler gave the following errors/warnings.

[bcc32 Error] csv.c(42): E2209 Unable to open include file 'sqlite3ext.h'
I fixed this error by changing <sqlite3ext.h> to "sqlite3ext.h"

[bcc32 Error] sqlite3.c(204450): E2451 Undefined symbol 'sqlite3_stmt_init'
Not sure if this is to do with the fact that stmt.c is already present in sqlite3.c

[bcc32 Error] compress.c(18): E2209 Unable to open include file 'zlib.h'
Above error appears even if I change <zlib.h> to "zlib.h"
[bcc32 Warning] compress.c(54): W8065 Call to function 'compress' with no prototype
[bcc32 Error] compress.c(55): E2451 Undefined symbol 'Z_OK'
[bcc32 Warning] compress.c(87): W8065 Call to function 'uncompress' with no prototype
[bcc32 Error] compress.c(88): E2451 Undefined symbol 'Z_OK'


Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Keith Medcalf

stmt.c is already included, so you do not need to include it again.  To "turn on" the builtin stmt_vtab you need to add the preprocessor define:

SQLITE_ENABLE_STMTVTAB

There are a bunch of extensions and modules already included in the amalgamation sqlite3.c that you just need to "turn on" via preprocessor directives.

See
https://www.sqlite.org/amalgamation.html
https://www.sqlite.org/compile.html

As for the compress extension it uses zlib.  So you have to have zlib compiled for your platform and compiler available on your system.  Generally this will be a static library of some type that you must include as a link library, and have the .h file somewhere in an included directory.  The static and dynamic libraries are included with all versions of the gcc compiler, you just have to tell the compiler to link it.  For other compilers the level of complication and bother to get something working will vary.


Useful hint:

You can put all your defines as normal statements in a file called config.h that lives in the same directory as the sqlite3.c source and "activate" that being included very early in sqlite3.c to configure the compilation by defining the preprocessor symbol:

_HAVE_SQLITE_CONFIG_H

That way, you do not have to define so many preprocessor macros to the compiler itself.  And you can fiddle with them easily.

config.h should look something like (you will notice that I configure a lot of stuff including different defaults depending on the compiler and model used -- since gcc supports everything and msvc is cannot even do floating point arithmetic worth a crap).  Note that when building from canonical sources the config.h is built by configure so you cannot use it for this purpose, but it works with the amalgamation compilation just fine:

---//--- snip ---//---
#ifndef _CONFIG_H
#define _CONFIG_H

// Values of WINVER and _WIN32_WINNT for various minimum levels of Win32 Compatability
//
// WIN10    0x0A00      WIN6     0x0600      W2K      0x0500     NT4      0x0400
//                      VISTA    0x0600      WXP      0x0501     W95      0x0400
//                      W2K8     0x0600      W2K3     0x0502     NT4E     0x0401
//                      WIN7     0x0601                          W98      0x0410
//                      WIN8     0x0602                          WME      0x0490
//                      WIN81    0x0603

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#endif
#ifndef WINVER
#define WINVER _WIN32_WINNT
#endif

// *** SQLITE GENERAL CONFIGURATION OPTIONS ***

// #define SQLITE_DEFAULT_AUTOMATIC_INDEX      1               // default: 1
// #define SQLITE_DEFAULT_AUTOVACUUM           0               // default: 0

// Set Default Page Cache Size and Temp Cache Size based on Memory Model

#if defined(_WIN64)
#define SQLITE_DEFAULT_CACHE_SIZE          262144           // 1 GB
#define SQLITE_DEFAULT_TEMP_CACHE_SIZE     262144           // 1 GB default: 500 pages
#else
#define SQLITE_DEFAULT_CACHE_SIZE           65536           // 256 MB
#define SQLITE_DEFAULT_TEMP_CACHE_SIZE      65536           // 256 MB default: 500 pages
#endif

// #define SQLITE_DEFAULT_FILE_FORMAT          4               // default: 4
// #define SQLITE_DEFAULT_FILE_PERMISSIONS     0644            // default: 0644
#define SQLITE_DEFAULT_FOREIGN_KEYS         1               // default: 0
// #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT   4194304         // default: -1
// #define SQLITE_DEFAULT_LOCKING_MODE         0               // default: 0
// #define SQLITE_DEFAULT_MEMSTATUS            1               // default: 1
#define SQLITE_DEFAULT_PAGE_SIZE            4096            // default: 4096 max: 65536
// #define SQLITE_DEFAULT_SYNCHRONOUS          2               // default: 2
// #define SQLITE_DEFAULT_WAL_SYNCHRONOUS      2               // default: same as default synchronous
// #define SQLITE_DEFAULT_WORKER_THREADS       4               // default: 0
#define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT   256             // default: 1000 pages
#define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755            // default: 0755
#define SQLITE_DEFAULT_RECURSIVE_TRIGGERS   1               // default: 0
#define SQLITE_DEFAULT_SHARED_CACHE         0               // default: 0
#define SQLITE_DEFAULT_MMAP_SIZE            0               // default: 0
// #define SQLITE_LIKE_DOESNT_MATCH_BLOBS      1               // default: undefined
// #define SQLITE_SORTER_PMASZ                 64              // default: 250
// #define SQLITE_EXTRA_DURABLE                1               // Extra DirSync's default not defined


// *** SQLITE FEATURE CONFIGURATION OPTIONS ***

#define SQLITE_ALLOW_COVERING_INDEX_SCAN 1
#define SQLITE_INTROSPECTION_PRAGMAS 1                      // Add Instropsection Pragmas
#define SQLITE_ENABLE_8_3_NAMES 1
// #define SQLITE_ENABLE_ATOMIC_WRITE 1
#define SQLITE_ENABLE_API_ARMOR 1                           // Enable API Armour
#define SQLITE_ENABLE_COLUMN_METADATA 1
#define SQLITE_ENABLE_COSTMULT 1
#define SQLITE_ENABLE_CURSOR_HINTS 1
#define SQLITE_COUNTOFVIEW_OPTIMIZATION 1
#define SQLITE_ENABLE_DBSTAT_VTAB 1
#define SQLITE_ENABLE_EXPLAIN_COMMENTS 1
#define SQLITE_ENABLE_FTS3 1
#define SQLITE_ENABLE_FTS3_PARENTHESIS 1
// #define SQLITE_DISABLE_FTS3_UNICODE 1
#define SQLITE_ENABLE_FTS4 1
#define SQLITE_ENABLE_FTS5 1
// #define SQLITE_ENABLE_ICU 1                                 // Set in BUILD Command additional Libs required
#define SQLITE_ENABLE_JSON1 1                               // Enable JSON1 -- when standard extension
#define SQLITE_ENABLE_LOAD_EXTENSION 1
#define SQLITE_ENABLE_LOCKING_STYLE 1
#define SQLITE_ENABLE_MEMORY_MANAGEMENT 1                   // Enable Memory Management (sqlite3_release_memory)
#define SQLITE_ENABLE_MEMSYS3 1
#define SQLITE_ENABLE_MEMSYS5 1
#define SQLITE_ENABLE_MODULE_COMMENTS 1
#define SQLITE_ENABLE_PREUPDATE_HOOK 1
// #define SQLITE_ENABLE_QPSG                                  // Enable Query Planner Stability Guarantee
#define SQLITE_ENABLE_RBU 1                                 // Enable Resumable Bulk Update
#define SQLITE_ENABLE_RTREE 1
// #define SQLITE_RTREE_INT_ONLY 1
#define SQLITE_ENABLE_SESSION 1                             // Enable the SESSION feature
// #define SQLITE_ENABLE_SNAPSHOT 1                            // Enable the SNAPSHOT feature
#define SQLITE_ENABLE_STAT_VTAB 1                           // Enable dbstat_register called from shell
#define SQLITE_ENABLE_STAT1 1
#define SQLITE_ENABLE_STAT2 1
#define SQLITE_ENABLE_STAT3 1
#define SQLITE_ENABLE_STAT4 1
#define SQLITE_ENABLE_STMTVTAB 1                            // Enable Stmt VTAB
#define SQLITE_ENABLE_UNIONVTAB 1                           // Enable unionvtab
// #define SQLITE_ENABLE_VFSSTAT 1                             // Enable vftstat extension
// #define SQLITE_LIKE_DOESNT_MATCH_BLOBS      1               // default: 0 (undefined)
#define SQLITE_STAT4_SAMPLES 64                             // default: 24 samples
// #define SQLITE_64BIT_STATS 1
// #define SQLITE_ENABLE_UNLOCK_NOTIFY 1                       // See Documentation before enabling
// #define SQLITE_ENABLE_UPDATE_DELETE_LIMIT 1                 // Requires Special Amalgamation / Parser Support
#define SQLITE_SOUNDEX 1
// #define SQLITE_DISABLE_LFS 1
// #define SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS 1
// #define SQLITE_DISABLE_DIRSYNC 1
// #define SQLITE_CASE_SENSITIVE_LIKE 1
// #define SQLITE_SECURE_DELETE 1
#define SQLITE_TEMP_STORE 2                                 // 0 = Files Always, 1 = Files, 2 = Memory, 3 Memory Always
#define SQLITE_USE_URI 1                                    // Enable URI Filenames
#define SQLITE_ALLOW_URI_AUTHORITY 1                        // Allow Authority (Host) in URI
// #define SQLITE_MMAP_READWRITE 1                             // mmaps are writeable as well as readable

//  *** SQLITE MAXIMUMS AND LIMITS CONFIGURATION ***

// #define SQLITE_FTS3_MAX_EXPR_DEPTH          15              // default: 12
#define SQLITE_MAX_ATTACHED                 15              // default: 10          max: 62
// #define SQLITE_MAX_COLUMN                   2000            // default: 2000        max: 32767
// #define SQLITE_MAX_COMPOUND_SELECT          500             // default: 500
// #define SQLITE_MAX_EXPR_DEPTH               1000            // default: 1000
// #define SQLITE_MAX_FUNCTION_ARG             100             // default: 100         max: 127
// #define SQLITE_MAX_LENGTH                   0x3fffffff      // default: 1000000000  max: 2147483647 (2^31-1)
// #define SQLITE_MAX_LIKE_PATTERN_LENGTH      16384           // default: 50000
// #define SQLITE_MAX_MEMORY                   0               // default: 0
// #if defined(_WIN64)
// #define SQLITE_MAX_MEMORY                   4294967296      // 4 GB on x64
// #else
// #define SQLITE_MAX_MEMORY                   1073741824      // 1 GB on x32
// #endif
// #define SQLITE_MAX_MMAP_SIZE                0x7fff0000      // default: 0x7fff0000
// #define SQLITE_MAX_PAGE_COUNT               1073741823      // default: 1073741823  max: 2147483646 (2^31-2)
// #define SQLITE_MAX_SQL_LENGTH               131072          // default: 1000000     max: 2^30
// #define SQLITE_MAX_TRIGGER_DEPTH            1000            // default: 1000
// #define SQLITE_MAX_VARIABLE_NUMBER          999             // default: 999
// #define SQLITE_MAX_SCHEMA_RETRY             50              // default: 50
// #define SQLITE_MAX_WORKER_THREADS           8               // default: 11
// #define YYSTACKDEPTH                        100             // defautl: 100

//  *** SQLITE OPERATING SYSTEM AND INTERNALS CONFIGURATION ***

//  #define SQLITE_OS_OTHER 0
#define SQLITE_OS_WIN 1
#define SQLITE_OS_WINNT 1
// #define SQLITE_OS_WINCE 1
// #define SQLITE_OS_WINRT 1
#define SQLITE_WIN32_MALLOC 1                               // Use Win32 Heap Allocator
// #define SQLITE_WIN32_HEAP_CREATE 1                          // Use Separate Win32 Heap
// #define SQLITE_WIN32_MALLOC_VALIDATE 1                      // Validate Win32 Heap during SQLITE_DEBUG assert
// #if defined(_WIN64)
// #define SQLITE_WIN32_HEAP_INIT_SIZE 1073741824              // Initial Win32 Heap Size = 1 GB
// #else
// #define SQLITE_WIN32_HEAP_INIT_SIZE 268435456               // Initial Win32 Heap Size = 256 MB
// #endif
// #define SQLITE_WIN32_HEAP_MAX_SIZE 0                        // Max Win32 Heap Size (No Limit)
// #define SQLITE_WIN32_HEAP_FLAGS 0
// #define SQLITE_WIN32_FILE_WRITETHROUGH 1                    // Force Windows WRITE-THROUGH Behaviour
// #define SQLITE_DIRECT_OVERFLOW_READ 1                       // Do Not PageCache Overflow Pages
// #define SQLITE_DEFAULT_LOOKASIDE 1200,100                   // Default LookAside Allocation
// #define SQLITE_SYSTEM_MALLOC 1                              // Use Default System Heap (default if no other specified)
// #define SQLITE_MALLOC_SOFT_LIMIT 1024
// #define SQLITE_POWERSAFE_OVERWRITE 0
// #define SQLITE_4_BYTE_ALIGNED_MALLOC 1
// #define SQLITE_USE_ALLOCA 1                                 // Use AllocA to Allocate Parse object os Stack


// *** SQLITE OMIT FEATURES ***

// #define SQLITE_OMIT_ALTERTABLE
// #define SQLITE_OMIT_ANALYZE
// #define SQLITE_OMIT_ATTACH
// #define SQLITE_OMIT_AUTHORIZATION
// #define SQLITE_OMIT_AUTOINCREMENT
// #define SQLITE_OMIT_AUTOINIT
// #define SQLITE_OMIT_AUTOMATIC_INDEX
// #define SQLITE_OMIT_AUTORESET
// #define SQLITE_OMIT_AUTOVACUUM
// #define SQLITE_OMIT_BETWEEN_OPTIMIZATION
// #define SQLITE_OMIT_BLOB_LITERAL
// #define SQLITE_OMIT_BTREECOUNT
// #define SQLITE_OMIT_BUILTIN_TEST
// #define SQLITE_OMIT_CAST
// #define SQLITE_OMIT_CHECK
// #define SQLITE_OMIT_COMPILEOPTION_DIAGS
// #define SQLITE_OMIT_COMPLETE
// #define SQLITE_OMIT_COMPOUND_SELECT
// #define SQLITE_OMIT_DATETIME_FUNCS
// #define SQLITE_OMIT_DECLTYPE
// #define SQLITE_OMIT_DEPRECATED
// #define SQLITE_OMIT_DISKIO
// #define SQLITE_OMIT_EXPLAIN
// #define SQLITE_OMIT_FLAG_PRAGMAS
// #define SQLITE_OMIT_FLOATING_POINT
// #define SQLITE_OMIT_FOREIGN_KEY
// #define SQLITE_OMIT_GET_TABLE
// #define SQLITE_OMIT_INCRBLOB
// #define SQLITE_OMIT_INTEGRITY_CHECK
// #define SQLITE_OMIT_LIKE_OPTIMIZATION
// #define SQLITE_OMIT_LOAD_EXTENSION
// #define SQLITE_OMIT_LOCALTIME
// #define SQLITE_OMIT_LOOKASIDE
// #define SQLITE_OMIT_MEMORYDB
// #define SQLITE_OMIT_MERGE_SORT
// #define SQLITE_OMIT_OR_OPTIMIZATION
// #define SQLITE_OMIT_PAGER_PRAGMAS
// #define SQLITE_OMIT_PRAGMA
// #define SQLITE_OMIT_PROGRESS_CALLBACK
// #define SQLITE_OMIT_QUICKBALANCE
// #define SQLITE_OMIT_REINDEX
// #define SQLITE_OMIT_SCHEMA_PRAGMAS
// #define SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
// #define SQLITE_OMIT_SHARED_CACHE
// #define SQLITE_OMIT_SHUTDOWN_DIRECTORIES
// #define SQLITE_OMIT_SUBQUERY
// #define SQLITE_OMIT_TCL_VARIABLE
// #define SQLITE_OMIT_TEMPDB
// #define SQLITE_OMIT_TRACE
// #define SQLITE_OMIT_TRIGGER
// #define SQLITE_OMIT_TRUNCATE_OPTIMIZATION
// #define SQLITE_OMIT_UTF16
// #define SQLITE_OMIT_VACUUM
// #define SQLITE_OMIT_VIEW
// #define SQLITE_OMIT_VIRTUALTABLE
// #define SQLITE_OMIT_WAL
// #define SQLITE_OMIT_WSD
// #define SQLITE_OMIT_XFER_OPT

// *** SQLITE DEBUGGING FEATURES ***

// #define SQLITE_DEBUG 1
// #define SQLITE_ENABLE_EXPENSIVE_ASSERT 1
// #define SQLITE_ENABLE_OVERSIZE_CELL_CHECK 1
// #define SQLITE_ENABLE_SELECTTRACE 1                         // Enable Select Trace (.selecttrace 0x100) needs SQLITE_DEBUG
// #define SQLITE_ENABLE_SQLLOG 1                              // Enable SQLITE_CONFIG_SQLLOG (see documentation)
// #define SQLITE_ENABLE_STMT_SCANSTATUS 1                     // Enable Collection of Statement Scan Status
// #define SQLITE_ENABLE_WHERETRACE 1
// #define SQLITE_IOTRACE 1
// #define SQLITE_MEMDEBUG 1
// #define SQLITE_REVERSE_UNORDERED_SELECTS 1
// #define SQLITE_USE_FCNTL_TRACE 1                            // Enable extra vfslog fcntrl trace
// #define SQLITE_YYTRACKMAXSTACKDEPTH 1


// *** Custom Additions ***

#define SQLITE_NOW_STABILITY_STMT 1                         // Make 'now' stable within a statement, not only for a step
// #define SQLITE_WIN32_FILE_SEQUENTIAL 1                      // Force Windows SEQUENTIAL access cache behaviour
#define SQLITE_WIN32_FILE_RANDOM 1                          // Force Windows RANDOM access cache behaviour
#define WHERE_PATH_SIMPLE 50                                // Paths to remember for  2-way joins
#define WHERE_PATH_COMPLEX 100                              // Paths to remember for >2-way joins
#define SQLITE_USE_QUADMATH 1                               // Use 128-bit Float Intermediates if available

// Recommended Optimizations

// #define SQLITE_THREADSAFE                   0                   // Remove Thread Safety Mutexes
// #define SQLITE_DEFAULT_MEMSTATUS            0                   // Remove Memory Status from SQLITE3_MALLOC
#define SQLITE_DEFAULT_WAL_SYNCHRONOUS      1                   // Reduce Synchronous to NORMAL in WAL mode
#define SQLITE_LIKE_DOESNT_MATCH_BLOBS      1                   // Disable LIKE matching for BLOBS
// #define SQLITE_MAX_EXPR_DEPTH               0                   // Disable Parser Depth Checking
// #define SQLITE_OMIT_DECLTYPE                1                   // Omit Declaration Type from Cursors
// #define SQLITE_OMIT_DEPRECATED              1                   // Omit Deprecated Code
// #define SQLITE_OMIT_PROGRESS_CALLBACK       1                   // Omit Progress Callback loop counter
// #define SQLITE_OMIT_SHARED_CACHE            1                   // Omit Shared Cache

// Compiler and Platform specifics

#define HAVE_FDATASYNC 1
#define HAVE_GMTIME_R 1
#define HAVE_LOCALTIME_S 1
#define HAVE_USLEEP 1
#define HAVE_UTIME 1
#define HAVE_MALLOC_USABLE_SIZE 1

#if defined(_WIN32) && defined(__GNUC__)
#define UNICODE_STRING_MAX_BYTES ((WORD)65534)
#define UNICODE_STRING_MAX_CHARS (32766)
#define HAVE_ISNAN 1
#endif

#if defined(__GNUC__) && defined(SQLITE_USE_QUADMATH)
#define LONGDOUBLE_TYPE __float128
#endif
#endif
---//-- snip --//--

and that is how I end up with this after building the shell:

SQLite version 3.21.0 2017-08-25 13:34:18
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> pragma compile_options;
ALLOW_COVERING_INDEX_SCAN
ALLOW_URI_AUTHORITY
COMPILER=gcc-7.1.0
DEFAULT_CACHE_SIZE=262144
DEFAULT_FOREIGN_KEYS
DEFAULT_MMAP_SIZE=0
DEFAULT_PAGE_SIZE=4096
DEFAULT_PROXYDIR_PERMISSIONS=0755
DEFAULT_RECURSIVE_TRIGGERS
DEFAULT_WAL_AUTOCHECKPOINT=256
DEFAULT_WAL_SYNCHRONOUS=1
ENABLE_8_3_NAMES=1
ENABLE_API_ARMOR
ENABLE_COLUMN_METADATA
ENABLE_COSTMULT
ENABLE_CURSOR_HINTS
ENABLE_DBSTAT_VTAB
ENABLE_FTS3
ENABLE_FTS3_PARENTHESIS
ENABLE_FTS4
ENABLE_FTS5
ENABLE_JSON1
ENABLE_LOAD_EXTENSION
ENABLE_LOCKING_STYLE=1
ENABLE_MEMORY_MANAGEMENT
ENABLE_MEMSYS3
ENABLE_MEMSYS5
ENABLE_PREUPDATE_HOOK
ENABLE_RBU
ENABLE_RTREE
ENABLE_SESSION
ENABLE_STAT4
ENABLE_STMTVTAB
EXTRA_INIT=core_init
HAVE_ISNAN
LIKE_DOESNT_MATCH_BLOBS
MAX_ATTACHED=15
SOUNDEX
STAT4_SAMPLES=64
TEMP_STORE=2
THREADSAFE=1
USE_URI
WIN32_MALLOC

(the EXTRA_INIT being set separately so I can build an "unmodified" version without all the extra extensions for debugging ..)

---
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-
>[hidden email]] On Behalf Of curmudgeon
>Sent: Friday, 25 August, 2017 07:41
>To: [hidden email]
>Subject: Re: [sqlite] Compiling spellfix for sqlite3
>
>While testing I appended the following code to the end of sqlite3.c.
>
>#include "csv.c"
>#include "stmt.c"
>#include "compress.c"
>#include "eval.c"
>#include "carray.c"
>
>int core_init(const char* dummy)
>{
> int nErr = 0;
> nErr +=
>sqlite3_auto_extension((void(*)())sqlite3_compress_init);
> nErr += sqlite3_auto_extension((void(*)())sqlite3_eval_init);
>#ifndef SQLITE_OMIT_VIRTUALTABLE
> nErr += sqlite3_auto_extension((void(*)())sqlite3_csv_init);
> nErr += sqlite3_auto_extension((void(*)())sqlite3_stmt_init);
> nErr += sqlite3_auto_extension((void(*)())sqlite3_carray_init);
>#endif
> return nErr ? SQLITE_ERROR : SQLITE_OK;
>}
>
>
>My compiler gave the following errors/warnings.
>
>[bcc32 Error] csv.c(42): E2209 Unable to open include file
>'sqlite3ext.h'
>I fixed this error by changing <sqlite3ext.h> to "sqlite3ext.h"
>
>[bcc32 Error] sqlite3.c(204450): E2451 Undefined symbol
>'sqlite3_stmt_init'
>Not sure if this is to do with the fact that stmt.c is already
>present in
>sqlite3.c
>
>[bcc32 Error] compress.c(18): E2209 Unable to open include file
>'zlib.h'
>Above error appears even if I change <zlib.h> to "zlib.h"
>[bcc32 Warning] compress.c(54): W8065 Call to function 'compress'
>with no
>prototype
>[bcc32 Error] compress.c(55): E2451 Undefined symbol 'Z_OK'
>[bcc32 Warning] compress.c(87): W8065 Call to function 'uncompress'
>with no
>prototype
>[bcc32 Error] compress.c(88): E2451 Undefined symbol 'Z_OK'
>
>
>
>
>
>
>--
>View this message in context:
>http://sqlite.1065341.n5.nabble.com/Compiling-spellfix-for-sqlite3-
>tp70656p97100.html
>Sent from the SQLite mailing list archive at Nabble.com.
>_______________________________________________
>sqlite-users mailing list
>[hidden email]
>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

curmudgeon
Thanks Keith, the config info is most welcome. I wasn't sure if I was supposed to download zlib.h the fact it was inside <> instead of "" but understand now.

Is the include <sqlite3ext.h> in csv.c not a bug though, or is it again down to my compiler?
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Keith Medcalf

When the included file is in " " then the file is expected to be located relative to the current directory.  If the included file is in < > then it is relative to one of the directories specified in the "include search path".  This search may or may not include the "current directory" but to have "current directory" included, you have to specify the directory location specifically to the compiler -- it does not automatically look in the current directory for files included with the < > syntax.

So for example, GCC sets several default search locations based on the location of the compiler executable itself (so it can find the headers included with the compiler).  It then "appends" the directories specified in the INCLUDE environment variable to that list.  Command line options (and compilers with GUI interfaces will have the same options somewhere) allow the specification of "prepends" and "appends" to that list of directories.  Most compilers work the same way.

There is also a "LIB search path" that works the same way for linking the object files and libraries together.  GCC has defaults set according to the location of the compiler executable, then appends the paths found in the LIB environment variable, and then has Command line (located in the GUI options for other compilers) that let you prepend and append additional paths to the list.

The include and lib paths work the same way for almost all compilers, though there are a few exceptions.  For example, there is an old Fortran compiler that looks specifically in the "F99INCLUDE" environment variable for included Fortran code (actually, anything that is not a .h file), and the "INCLUDE" environment variable only for .h files.  Most compilers, however, only use one set of "include" and "lib" paths and know how to search for the files specifically.

Because the INCLUDE and LIB paths are a list of multiple directories to search, order is important.  Only the first file found matching the specified name/type will be used.  (Similar to the PATH environment variable on Windows used to search for executables).  This is why the compiler itself will usually have a pre-set location list as a starting point, to ensure that those files and libraries specific to the compiler are used in preference to any you might add later.

So if you were to find a copy of zlib prebuilt for your platform and compiler you would get at least a .h and .lib (headers and pre-compiled library file).  You can stick those anywhere you like and add the directory where you put then to the INCLUDE search path (so the #include <zlib.h> will find it) and the LIB path (so you can specify that Z.LIB or whatever it is named for you) can be located when you add the z.lib library to be linked to your project.

In many cases these path additions are done by adding them (and may be done automatically for you when you install the library) to the INCLUDE and LIB environment variables.  That way whenever you need/reference the library/headers they will be found.

---
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-
>[hidden email]] On Behalf Of curmudgeon
>Sent: Friday, 25 August, 2017 11:35
>To: [hidden email]
>Subject: Re: [sqlite] Compiling spellfix for sqlite3
>
>Thanks Keith, the config info is most welcome. I wasn't sure if I was
>supposed to download zlib.h the fact it was inside <> instead of ""
>but
>understand now.
>
>Is the include <sqlite3ext.h> in csv.c not a bug though, or is it
>again down
>to my compiler?
>
>
>
>--
>View this message in context:
>http://sqlite.1065341.n5.nabble.com/Compiling-spellfix-for-sqlite3-
>tp70656p97105.html
>Sent from the SQLite mailing list archive at Nabble.com.
>_______________________________________________
>sqlite-users mailing list
>[hidden email]
>http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
Reply | Threaded
Open this post in threaded view
|

Re: Compiling spellfix for sqlite3

Richard Damon
On 8/25/17 2:15 PM, Keith Medcalf wrote:
> When the included file is in " " then the file is expected to be located relative to the current directory.  If the included file is in < > then it is relative to one of the directories specified in the "include search path".  This search may or may not include the "current directory" but to have "current directory" included, you have to specify the directory location specifically to the compiler -- it does not automatically look in the current directory for files included with the < > syntax.
This is incorrect. The Standard doesn't even require the that Standard
define includes even actually be 'C files', and the header files don't
need to be in 'directory'

What the standard does say is that includes specified with <> look in a
set of implementation defined places, and that includes with "" look in
another set of implementation defined places, with the addition that if
it doesn't find them there, it looks in the places defined for <>

Generally, and traditionally, the <> list of places is thought of as the
'system' include path, and the "" list of places are the user include
path, and it is fairly normal that the "" list includes the current
directory.


--
Richard Damon

_______________________________________________
sqlite-users mailing list
[hidden email]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
12