Julian Hyde created CALCITE-4173:
------------------------------------

             Summary: Add internal SEARCH operator and Sarg literal, replacing 
use of IN in RexCall
                 Key: CALCITE-4173
                 URL: https://issues.apache.org/jira/browse/CALCITE-4173
             Project: Calcite
          Issue Type: Bug
            Reporter: Julian Hyde


Add internal SEARCH operator and Sarg literal, replacing use of IN in RexCall.

Recently we started to allow IN in RexCalls to represent lists of constant 
values; previously it had only been allowed in SqlCall. The use is confusing, 
because a RexSubQuery is a sub-class of RexCall that may also use IN as its 
operator.

More important, we would like to be able to represent more general search 
arguments in a single RexCall. Examples: 
* {{x BETWEEN 3 AND 10}}
* {{x > 3 AND x <= 10}}
* {{x NOT BETWEEN 3 AND 10}}
* {{x IS NULL OR x BETWEEN 3 AND 100 AND x != 50 OR x IN (200, 300, 400)}}
* {{x > 5 AND x < 10 AND x IN (3, 8, 10, 20)}}

All of these can be converted to sets of ranges, where each range has a lower 
or upper bound (or both), bounds can be open or closed, plus a flag to say 
whether NULL is an allowed value. Guava's RangeSet is an efficient 
implementation of range sets.

This change would create a new class {{Sarg}} to represent a range set as a 
literal. The new internal SEARCH operator tests whether an operand belongs to 
the range set.

A RexCall to SEARCH is converted back to SQL, typically an IN or OR.

This change would obsolete the use of IN in {{RexCall}} to represent a fixed 
list of values. (This is a breaking change, but when we first allowed IN in 
{{RexCall}}, in CALCITE-2444, it was only intended to be for 
{{RelToSqlConverter}}. Most people still believe that [IN is not 
allowed|https://lists.apache.org/thread.html/e1c5d56ecca7c1bc3608344ceac9b209bb8100fbca1c1928feb9cce7%40%3Cdev.calcite.apache.org%3E].)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to