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. 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

Reply via email to