char inserts two chars for these... so it's hard to generate a sequence
that looks like '1' for length function... inserting a C string that was
'hi\xc2\x93\x93\x93\x93\x93\x93' length would be 3.
'hi\x93\x93\x93\x93\x93\x93' length would be 9.

but without bind... this is as much as I can show.

insert into test (a) values
('hi'||char(192)||char(150)||char(150)||char(150)||char(150)||'there' );
insert into test (a) values ('hi'||char(0)||'there' );
select length(a),a from test;
(output to windows terminal)
12|hiÀ––––there
2|hi

(in notepad++, )
12|hiÀ––––there
2|hi

(although that is what I would expect.  I wouldn't suggest changing any of
that, well ya, ...)

2|hi'||char(0)||'there

would look better - but in the select output context there aren't
quotes.... although that does work to preserve data for sqlite backup.

On Fri, Jan 26, 2018 at 5:22 PM, petern <peter.nichvolo...@gmail.com> wrote:

> That's an interesting idea, using BLOBs.  BLOB strings would be more
> practical if common SQL scalar operators { || , LIKE, =, <>,...} could be
> overloaded with user definable BLOB specific implementations.  At the same
> time subtype and pointer type would have to be improved to work in all
> cases.  This would be far more general solution than messing up the API
> with ubiquitous length argument.
>
> FYI, here are some current very serious deficiencies with BLOB type system
> including detailed test programs:
>

Blob also is binary, and I'm not dealing with binary, i'm dealing with UTF8
Text.  It is a totally different sort of thing than a BLOB would be.


>
> http://sqlite.1065341.n5.nabble.com/sqlite3-value-
> pointer-metadata-is-also-stripped-by-trivial-cross-
> join-Defect-tt100000.html
>
> http://sqlite.1065341.n5.nabble.com/Defect-trivial-cross-join-strips-BLOB-
> subtype-tt99982.html
>
> Still waiting for an answer about why BLOB types are lost in a trivial
> cross join.  No answer.
>

That's interesting; I have seen, in the shell, that if the column is blob,
it is just not shown.


>
> Is there a legitimate reason why BLOB type information cannot be passed
> through a join?
>
>



> Peter
>
> On Fri, Jan 26, 2018 at 4:36 PM, Keith Medcalf <kmedc...@dessus.com>
> wrote:
>
> >
> > 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-
> > >boun...@mailinglists.sqlite.org] 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 <
> > >peter.dasi...@flightaware.com> wrote:
> > >
> > >> On 2018-01-26, at 17:05, J Decker <d3c...@gmail.com> wrote:
> > >> > On Fri, Jan 26, 2018 at 1:21 PM, Peter Da Silva <
> > >> > peter.dasi...@flightaware.com> 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
> > >> sqlite-users@mailinglists.sqlite.org
> > >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-
> > >users
> > >>
> > >_______________________________________________
> > >sqlite-users mailing list
> > >sqlite-users@mailinglists.sqlite.org
> > >http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
> >
> >
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to