SQLite3 segmentation at prepare statement

Charles Hixson charleshixsn at earthlink.net
Thu Sep 19 09:51:32 PDT 2013


This doesn't seem to be a D problem.  I re-implemented it in C and got 
the same error.

On 09/18/2013 02:00 PM, Charles Hixson wrote:
> I'm trying to use SQLite3 in D, but am getting a segmentation fault 
> when I attempt to replace the exec statement with a prepare 
> statement.  What am I doing wrong?
>
> If the prepare statement is commented out, and the exec statement is 
> uncommented, the program runs successfully.  (There's no data yet in 
> the database file.)
>
> The test program is:
>
> pragma    (lib, "sqlite3");
>
>
> import    etc.c.sqlite3;
> import    std.exception;
> import    std.stdio;
> import    std.string;
>
> /**    int function(void*, int, char**, char**) callback    */
> extern(C)
> int    callback    (void* notUsed, int argc, char** argv, char** 
> azColName)
> {
>     for    (int i = 0;    i < argc;    i++)
>     {    printf ("%s = %s\n", azColName[i], argv[i] ? argv[i] : 
> "null");    }
>     printf    ("\n");
>     return    0;
> }
>
> void    main()
> {    sqlite3*    db;
>     int        rc;
>     char*        zErrMsg    =    null;
>     sqlite3_stmt**    stmt;
>
>     rc    =    sqlite3_open (toStringz("data/sqlitetest.db"), &db);
>     if    (SQLITE_OK != rc)
>     {    printf ("DB create error: %s\n", sqlite3_errmsg(db) ); }
>
>     string    sql    =
>         "create table if not exists wrds (name text primary key, id 
> int)\0";
>     rc    =    sqlite3_exec(db, sql.ptr, &callback, cast(void*)0, 
> &zErrMsg);
>     if    (SQLITE_OK != rc)
>     {    printf ("DB create table error: %s\n", sqlite3_errmsg(db) );
>         printf    ("sql = <<%s>>\n", sql);
>     }
>
>     sql    =    "select * from wrds\0";
>     rc    =    sqlite3_prepare(db, toStringz(sql), 
> cast(int)sql.length, stmt, null);
> //    if    (SQLITE_OK != rc)
> //    {    printf ("DB prepare statement error: %s\n", 
> sqlite3_errmsg(db) );
> //        printf    ("sql = <<%s>>\n", sql);
> //    }
> //    rc    =    sqlite3_step(*stmt);
> //    if    (SQLITE_OK != rc)
> //    {    printf ("DB statement step error: %s\n", sqlite3_errmsg(db) );
> //        printf    ("sql = <<%s>>\n", sql);
> //    }
> //
> //    rc    =    sqlite3_exec(db, sql.ptr, &callback, cast(void*)0, 
> &zErrMsg);
> //    if    (SQLITE_OK != rc)
> //    {    printf ("DB select error: %s\n", sqlite3_errmsg(db) );
> //        printf    ("sql = <<%s>>\n", sql);
> //    }
> //
>     rc    =    sqlite3_close    (db);
>     enforce    (rc == SQLITE_OK);
> }
>


-- 
Charles Hixson



More information about the Digitalmars-d-learn mailing list