pgsql/src backend/executor/nodeAgg.c backend/e ...

Поиск
Список
Период
Сортировка
От Tom Lane
Тема pgsql/src backend/executor/nodeAgg.c backend/e ...
Дата
Msg-id 200102160316.f1G3GxK56475@hub.org
обсуждение исходный текст
Список pgsql-committers
CVSROOT:    /home/projects/pgsql/cvsroot
Module name:    pgsql
Changes by:    tgl@hub.org    01/02/15 22:16:58

Modified files:
    src/backend/executor: nodeAgg.c nodeGroup.c
    src/backend/optimizer/path: indxpath.c
    src/backend/optimizer/plan: initsplan.c
    src/backend/parser: parse_clause.c parse_expr.c parse_oper.c
    src/include/parser: parse_oper.h
    src/backend/commands: analyze.c

Log message:
    Clean up two rather nasty bugs in operator selection code.

    1. If there is exactly one pg_operator entry of the right name and oprkind,
    oper() and related routines would return that entry whether its input type
    had anything to do with the request or not.  This is just premature
    optimization: we shouldn't return the single candidate until after we verify
    that it really is a valid candidate, ie, is at least coercion-compatible
    with the given types.

    2. oper() and related routines only promise a coercion-compatible result.
    Unfortunately, there were quite a few callers that assumed the returned
    operator is binary-compatible with the given datatype; they would proceed
    to call it without making any datatype coercions.  These callers include
    sorting, grouping, aggregation, and VACUUM ANALYZE.  In general I think
    it is appropriate for these callers to require an exact or binary-compatible
    match, so I've added a new routine compatible_oper() that only succeeds if
    it can find an operator that doesn't require any run-time conversions.
    Callers now call oper() or compatible_oper() depending on whether they are
    prepared to deal with type conversion or not.

    The upshot of these bugs is revealed by the following silliness in PL/Tcl's
    selftest: it creates an operator @< on int4, and then tries to use it to
    sort a char(N) column.  The system would let it do that :-( (and evidently
    has done so since 6.3 :-( :-().  The result in this case was just a silly
    sort order, but the reverse combination would've provoked coredump from
    trying to dereference integers.  With this fix you get more reasonable
    behavior:
    pltcl_test=# select * from T_pkey1 order by key1, key2 using @<;
    ERROR:  Unable to identify an operator '@<' for types 'bpchar' and 'bpchar'
    You will have to retype this query using an explicit cast


В списке pgsql-committers по дате отправления:

Предыдущее
От: Hiroshi Inoue
Дата:
Сообщение: pgsql/src/interfaces/odbc convert.c
Следующее
От: Tom Lane
Дата:
Сообщение: pgsql/src/pl/tcl/test test.expected test_queri ...