SQLite

Check-in [25033ee945]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Corrections to the IN-operator notes.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | rowvalue
Files: files | file ages | folders
SHA1: 25033ee94538289ba7e0147da30a18300047123f
User & Date: drh 2016-08-25 14:23:59.673
Context
2016-08-25
15:46
Improvements to IN operator code generator comments. Avoid unnecessary Copy operations on the LHS of the IN operator. (check-in: b634429878 user: drh tags: rowvalue)
14:23
Corrections to the IN-operator notes. (check-in: 25033ee945 user: drh tags: rowvalue)
14:00
Add notes on the implementation of the IN operator. (check-in: d256b2caeb user: drh tags: rowvalue)
Changes
Side-by-Side Diff Ignore Whitespace Patch
Changes to src/in-operator.md.
58
59
60
61
62
63
64
65
66


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

84
85
86
87
88
89
90

91
92

93
94
95
96
97
98
99
100
101
102
103
104
105
58
59
60
61
62
63
64


65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

83

84
85
86
87


88
89

90

91
92
93
94
95
96
97
98
99
100
101
102







-
-
+
+
















-
+
-




-
-
+

-
+
-












  4.  Return FALSE

## Optimized Algorithm

The following procedure computes the same answer as the simple full-scan
algorithm, though it does so with less work in the common case.  This
is the algorithm that is implemented in SQLite.  The steps must occur
in the order specified.  Except for the INDEX_NOOP optimization of step 1,
none of the steps can be skipped.
in the order specified.  Steps 1 and 3 are optional.  All other steps
are required for correctness.

  1.  If the RHS is a constant list of length 1 or 2, then rewrite the
      IN operator as a simple expression.  Implement

            x IN (y1,y2)

      as if it were

            x=y1 OR x=y2

      This is the INDEX_NOOP optimization and is only undertaken if the
      IN operator is used for membership testing.  If the IN operator is
      driving a loop, then skip this step entirely.

  2.  If the RHS is empty, return FALSE.

  3.  If the LHS is a total-NULL or if the RHS contains a total-NULL,
  3.  If the LHS is a total-NULL, then return NULL.
      then return NULL.

  4.  If the LHS is non-NULL, then use the LHS as a probe in a binary
      search of the RHS 

      <ol type='a'>
      <li> If the binary search finds an exact match, return TRUE
      4-A.  If the binary search finds an exact match, return TRUE

      <li> If the RHS is known to be not-null, return FALSE
      4-B.  If the RHS is known to be not-null, return FALSE
      </ol>

  5.  At this point, it is known that the result cannot be TRUE.  All
      that remains is to distinguish between NULL and FALSE.
      If a NOT-TRUE result is acceptable, then return NOT-TRUE now.

  6.  For each row in the RHS, compare that row against the LHS and
      if the result is NULL, immediately return NULL.  This step is
      essentially the "Simple Full-scan Algorithm" above with the
      tests for TRUE removed, since we know that the result cannot be
      TRUE at this point.

  7.  Return FALSE.