On 11/22/2016 9:26 AM, Richard Hipp wrote: > On 11/19/16, Richard Hipp <[email protected]> wrote: >> On 11/19/16, Andy Goth <[email protected]> wrote: >>> Is this extension documented? What is the precise behavior? Are >>> there guarantees that it will be preserved throughout future >>> versions of SQLite? When was it introduced? >> >> I thought I had documented this someplace, but now I cannot find >> where. > > Documentation added here: > https://www.sqlite.org/draft/lang_select.html#bareagg
Thanks. Sorry, I've been too busy to do it myself.
First sentence: Suggest changing "appears" to "appear" to match number
of subject ("names").
Second sentence: Suggest this alternate formulation:
A result column which contains a column name that is not within an
aggregate function and that does not appear in the GROUP BY clause (if
one exists) is called a "bare" column.
Consider this crazy thing:
CREATE TABLE x(a);
INSERT INTO x VALUES (1), (2.5), (4), (3), (2);
SELECT min(a)*avg(a), max(a)*avg(a) FROM x;
SELECT a*avg(a) FROM x;
SELECT a*avg(a), min(a)*avg(a), max(a)*avg(a) FROM x;
SELECT a*avg(a), max(a)*avg(a), min(a)*avg(a) FROM x;
The first SELECT is well-defined, even in standard SQL. It produces
2.5 and 10.0.
The second SELECT produces 5.0. Clearly it's multiplying the average
(2.5) by the last value inserted (2). Rearranging the INSERT order
suggests that it's always using the last value inserted. You made no
promises about this, and I can easily see ORDER BY or INDEXes or the
optimizer in general making an impact here, so I wouldn't rely on it.
Same goes for multiple rows having the same minimum or maximum value.
The third and fourth SELECTs hit the once-again-ambiguous case of mixing
max() and min() (there's your tongue-twister for the day). Their
a*avg(a) results are 10.0 and 2.5, respectively, suggesting the
rightmost max() or min() function determines which row is used to
compute bare columns. Do you want to document this behavior, or do you
want to reserve the right to change it later?
--
Andy Goth | <andrew.m.goth/at/gmail/dot/com>
signature.asc
Description: OpenPGP digital signature
_______________________________________________ fossil-dev mailing list [email protected] http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/fossil-dev
