I have a database with a table name containing a quote and a space.
Let's say it's called “Ben's table”

I have created it with:

     CREATE TABLE "Ben's table" ([column_spec]);

I tried the following in the SQLite shell:

    .import 'file_name.txt' "Ben's table"

But that does not work. So I had to dig a bit into shell.c to
understand, and I found the following:

 * inside the do_meta_command function, the arguments to dot-commands
   are tokenized with the following rules:

   * The tokenizer skips all whitespace character when finding the
     start for the next token.

   * When ' or " is found where a token should start, the token will be
     the portion of text between that delimiter and its next occurrence.
     There is no possibility to escape the delimiter.
     The two delimiters are discarded.

   * If any other character is found where a token should start, the
     token ends at whitespace.

   * Backslashes get special processing except for tokens that were
     delimited by the single quote.

 * inside the same do_meta_command method, when processing the import
   command, the name of the table is appended to some queries this way:

   sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zTable);

So, my .import command was tokenized that way:

    Token 1: file_name.txt
    Token 2: Ben's table      <--- note: double quotes gone.

And the SQL query that was forged was incorrect:

    INSERT INTO Ben's table VALUES(?...

The only way I found in order to have my import succeed was:

    .import 'file_name.txt' "[Ben's table]"

which I find cumbersome.

Are there any plans to improve the tokenizer to enable escaping the
delimiter (doubling the single quote or backslash-escaping the double
quote), and to escape the table name in the dot-commands?

Potential problem: how to use .backup or .restore with a file name that
contains both ' " and space?

Thanks.

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

Reply via email to