Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-4173

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

Rank to TopRank to BottomVotersWatch issueWatchersConvert to sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.26.0
    • Component/s: None

      Description

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

        Attachments

        Issue Links

          Activity

          $i18n.getText('security.level.explanation', $currentSelection) Viewable by All Users
          Cancel

            People

            • Assignee:
              julianhyde Julian Hyde
              Reporter:
              julianhyde Julian Hyde

              Dates

              • Created:
                Updated:
                Resolved:

                Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 9h
                9h

                  Issue deployment