On 22/9/62 02:25, Fredrik Larsen wrote:
Interesting, very similar change but not fully idenctial. In my patch, I
created a sqlite3ExprListCompareIgnoreButUpdateSort, and used this function
from line 6239. This function ignores the sort part when comparing
expressions, but will update the GroupBy sortOrder field if expressions are
found equal. I see dan modifies the sortFlag.

That sounds equivalent to me. The sortOrder/sortFlag thing is probably just because you patched the last release (3.29.0) or earlier. The field has changed names since then.

Dan.



Would be interesting to know
what effect this difference has. My change works in my test, but not sure
if it really works.

Anyway, super-nice that this issue is fixed officially. No I don't have to
wonder if my fix is really correct, or will suddenly corrupt something :)

Fredrik

On Sat, Sep 21, 2019 at 8:49 PM Keith Medcalf <kmedc...@dessus.com> wrote:

See Dan's checkin on trunk for this issue.

https://www.sqlite.org/src/info/20f7951bb238ddc0

-----Original Message-----
From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> On
Behalf Of Fredrik Larsen
Sent: Saturday, 21 September, 2019 08:12
To: SQLite mailing list <sqlite-users@mailinglists.sqlite.org>
Subject: Re: [sqlite] [EXTERNAL] Group-by and order-by-desc does not work
as expected

Your last sentence got me thinking. So I downloaded the source, modified
the ordering of the GROUP-BY expression to match ORDER-BY and it works!
This will offcourse only work if the GROUP-BY and ORDER-BY matches
generally expect for the direction. This fix only improves performance
for
relevant cases and keeps other cases unaffected. Not sure if I introduced
some subtle bugs with this modification, but my test-cases runs fine.

Fredrik

On Fri, Sep 20, 2019 at 6:57 PM Keith Medcalf <kmedc...@dessus.com>
wrote:

We can observe GROUP BY works ASCending only as of now. Why it can't
work
DESCending to avoid ordering, that's a different question.
>From https://www.sqlite.org/lang_select.html we can observe that
GROUP BY takes an expr on the RHS, while ORDER BY takes an expr
followed by optional COLLATE and ASC/DESC terms.
The GROUP BY clause does not imply ordering.  The fact that the output
is
ordered is an implementation detail -- the grouping could be
implemented by
a hash table, in which case the output would be ordered by hash value,
for
instance.  All that the expression in a GROUP BY does is determine the
groupings, and therefore the expression is limited to a comparison
compatible expression.  For example, you can GROUP BY x COLLATE NOCASE
which implies that the groups are formed using case insensitive
comparisons
of x.  The ORDER BY clause determines the output ordering.

You will note that if you do the following:

create table x(x,y);
create index ix on x(x desc, y);
select x, someaggregate(y) from x group by x order by x desc;

then ix will be used as a covering index (which is good) however the
group
by x is treated as an ordering expression, not as simply a grouping
expression.

In fact the code that implements the group by does indeed (perhaps
erroneously) treat the group by expression as implying order, since it
will
traverse the covering index in reverse order so that the output from
GROUP
BY is in ascending order, and add an extra sort to do the ORDER BY.

That means the GROUP BY code generator is already capable of traversing
the selected index in reverse order when necessary.  It appears that
the
optimizer however does not recognize that the "desc" attribute from the
order by can be "pushed down" into the GROUP BY (which really is
ordering
as an implementation detail) thus eliminating the ORDER BY processing
entirely.

Note that you cannot specify that the GROUP BY is ordering -- it will
not
accept the ASC or DESC keywords (which is correct), and this should not
be
changed, however, treating it as being ordering when it is not might
perhaps be a defect ...



_______________________________________________
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