I do not understand this at all. If the definition of a C-String is a "bunch-a-non-zero-byes-terminated-by-a-zero-byte", then how is it possible to have a zero/null byte "embedded" within a C-Style String?
Similarly, if a C-Style-Wide-String is defined as a "bunch-a-non-zero-words-terminated-by-a-zero-word", then how is it possible to have a zero/null word "embedded" within a C-Style-Wide-String? Given that SQLite3 is written in C and uses C-Strings or C-Style-Wide-Strings, then you cannot have zero/null bytes embedded in those strings. You may of course argue that perhaps SQLite3 should use something other than C-Style-Strings, however, this is not what seems to be proposed. It seems to be proposing the use of some magical C-Style-String that is not actually a C-Style-String, without explicitly stating this. SQLite3 does handle non-C-Ctyle-Strings. They are called "blobs". --- 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- >[email protected]] On Behalf Of J Decker >Sent: Friday, 26 January, 2018 17:18 >To: SQLite mailing list >Subject: Re: [sqlite] UTF8 and NUL > >On Fri, Jan 26, 2018 at 3:56 PM, Peter Da Silva < >[email protected]> wrote: > >> On 2018-01-26, at 17:05, J Decker <[email protected]> wrote: >> > On Fri, Jan 26, 2018 at 1:21 PM, Peter Da Silva < >> > [email protected]> wrote: >> >> Sqlite uses NUL as the string terminator internally, the >published API >> >> specifies has stuff like this all over the place: >> >> >>> In those routines that have a fourth argument, its value is the >number >> of bytes in the parameter. To be clear: the value is the number of >bytes in >> the value, not the number of characters. If the fourth parameter to >> sqlite3_bind_text() or sqlite3_bind_text16() is negative, then the >length >> of the string is the number of bytes UP TO THE FIRST ZERO >TERMINATOR. >> >> > You stressed the wrong part there - *IS NEGATIVE* >> >> Why? Passing -1 as the length is a common way to tell sqlite3 to >calculate >> the length itself. It's a documented and widely used part of the >API. > > >Exactly, so on neither side, input or output is there a problem >storing a >length of valid characters. >The deficiency is 1) the command line tool for diagnostics >2) always scanning for a nul in prepare() unless the length is before >that. It's simple to add an option that could change that behavior; >or >move the string measuring up to prepare[_v2,_v3,_v4] and even add a >V5 that >just passes the length passed without a scan. > >The input is read by a tokenizer that returns in-buffer references to >the >next SQL token by length. >Some tokens can be quoted, and those end up being a copy of the >original; >but the length of the SQL statement should already be known, so it >doesn't >need to scan for 0. > >Once tokenized it's converted into expressions; those expressions >(have >previously) stored only the char*. It's not a lot of places to >change to >include storing the length; which is often known unless the mprintf >internals are used; then any token passed through that does not pass >%s. >So %s cannot be used for UTF8 strings; but rather the literal string >fwrite( buf, 1, stringlen, <output) ; gets all the standard character >treatment as the file was opened with (O_BINARY or not, "b" or "t" >specifiers for fopen, or stderr ). > >fprintf( out, "%s", (string) ); >is exactly the same as >fwrite( out, 1, strlen( string ), string ); > >(Can anyone dispute that? I doubt that's specified) > >Other than, the fwrite will include outputing the NUL character and >trust >the length given to it. \n will still get promoted to \r\n depending >on >platform and C library personality. > > > > > >> Therefore: >> > > >> >> >> It would be a huge push-up to change this, it would break >everything, >> >> including extensions. I don't think it would be possible until >something >> >> like sqlite4. >> > >maybe I don't understand what you're saying 'it' is. > > >> _______________________________________________ >> sqlite-users mailing list >> [email protected] >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite- >users >> >_______________________________________________ >sqlite-users mailing list >[email protected] >http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list [email protected] http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

