# Tests for IN filters.

lookup-constraints left=(a int, b int) right=(x int, y int, z int) index=(x, y)
x IN (1, 2, 3) AND y = b
----
lookup expression:
  (x IN (1, 2, 3)) AND (b = y)

lookup-constraints left=(a int, b int) right=(x int, y int, z int) index=(x, y)
(x = 1 OR x = 2) AND y = b
----
lookup expression:
  (x IN (1, 2)) AND (b = y)

lookup-constraints left=(a int, b int) right=(x int, y int, z int) index=(x, y)
x IN (1, 2, 3)
----
lookup join not possible

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2, 3) AND y = b AND z = c
----
lookup expression:
  ((x IN (1, 2, 3)) AND (b = y)) AND (c = z)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2, 3) AND y = b AND (z > 10 OR z IN (1, 2, 3))
----
lookup expression:
  (x IN (1, 2, 3)) AND (b = y)
remaining filters:
  (z > 10) OR (z IN (1, 2, 3))

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y)
x IN (1, 2, 3) AND y = b AND z = c
----
lookup expression:
  (x IN (1, 2, 3)) AND (b = y)
remaining filters:
  z = c

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2, 3) AND y = 4 AND z = c
----
input projections:
  lookup_join_const_col_@8 = 4 [type=INT8]
lookup expression:
  ((x IN (1, 2, 3)) AND (lookup_join_const_col_@8 = y)) AND (c = z)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2, 3) AND y = b AND z = 1
----
input projections:
  lookup_join_const_col_@9 = 1 [type=INT8]
lookup expression:
  ((x IN (1, 2, 3)) AND (b = y)) AND (lookup_join_const_col_@9 = z)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2, 3) AND y = b AND z IN (4, 5, 6)
----
lookup expression:
  ((x IN (1, 2, 3)) AND (z IN (4, 5, 6))) AND (b = y)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2, 3) AND y = b AND z IN (4, 5, 6)
----
lookup expression:
  ((x IN (1, 2, 3)) AND (z IN (4, 5, 6))) AND (b = y)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
y = b
optional: x IN (1, 2, 3)
----
lookup expression:
  (x IN (1, 2, 3)) AND (b = y)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x = a
optional: y IN (1, 2, 3)
----
key cols:
  x = a

lookup-constraints left=(a int, b int) right=(x int, y int, z int) index=(x, y)
x = a AND z = 1
optional: y IN (1, 2, 3)
----
key cols:
  x = a
remaining filters:
  z = 1

lookup-constraints left=(a int, b int) right=(x int, y int, z int) index=(x, y)
x = a
optional: y IN (1, 2, 3) AND z = 1
----
key cols:
  x = a

lookup-constraints left=(a int, b int) right=(x int, y int, z int) index=(x, y, z)
x = a
optional: y IN (1, 2, 3) AND z = 1
----
input projections:
  lookup_join_const_col_@8 = 1 [type=INT8]
lookup expression:
  ((y IN (1, 2, 3)) AND (a = x)) AND (lookup_join_const_col_@8 = z)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x = 1 AND z = c
optional: y IN (3, 4)
----
input projections:
  lookup_join_const_col_@7 = 1 [type=INT8]
lookup expression:
  ((y IN (3, 4)) AND (lookup_join_const_col_@7 = x)) AND (c = z)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
z = c
optional: x IN (1, 2) AND y IN (3, 4)
----
lookup expression:
  ((x IN (1, 2)) AND (y IN (3, 4))) AND (c = z)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
y = b
optional: x IN (1, 2) AND z IN (3, 4)
----
lookup expression:
  (x IN (1, 2)) AND (b = y)

# The most restrictive IN filter should be chosen.
lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x IN (1, 2) AND y = b
optional: x IN (1, 2, 3)
----
lookup expression:
  (x IN (1, 2)) AND (b = y)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x IN (1, 2, 3) AND y = b
optional: x IN (1, 2)
----
lookup expression:
  (x IN (1, 2)) AND (b = y)
remaining filters:
  x IN (1, 2, 3)

# Do not normalize y = false to NOT x.
lookup-constraints left=(a int) right=(x int, y bool, z int) index=(x, y, z)
x = a AND y = false AND z > 0
----
input projections:
  lookup_join_const_col_@6 = false [type=BOOL]
lookup expression:
  ((z > 0) AND (a = x)) AND (lookup_join_const_col_@6 = y)


# Test for range filters.

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x = a AND y > 0
----
lookup expression:
  (y > 0) AND (a = x)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x desc, y desc)
x = a AND y > 0
----
lookup expression:
  (y > 0) AND (a = x)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x > 0
----
lookup join not possible

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x > 0 AND y = b
----
lookup join not possible

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x = a
optional: y > 0
----
key cols:
  x = a

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x = a AND y = b AND z > 0
----
lookup expression:
  ((z > 0) AND (a = x)) AND (b = y)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x = 1 AND y = b AND z > 0
----
input projections:
  lookup_join_const_col_@7 = 1 [type=INT8]
lookup expression:
  ((z > 0) AND (lookup_join_const_col_@7 = x)) AND (b = y)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x = a AND y = 1 AND z > 0
----
input projections:
  lookup_join_const_col_@8 = 1 [type=INT8]
lookup expression:
  ((z > 0) AND (a = x)) AND (lookup_join_const_col_@8 = y)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x = 1 AND y = b
optional: z > 0
----
key cols:
  x = lookup_join_const_col_@7
  y = b
input projections:
  lookup_join_const_col_@7 = 1 [type=INT8]

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y)
x = a AND z = 1
optional: y > 0
----
key cols:
  x = a
remaining filters:
  z = 1

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y)
x = a
optional: y > 0 AND z = 1
----
key cols:
  x = a


# Test for range filters and IN filters.

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2) AND y = b AND z > 0
----
lookup expression:
  ((x IN (1, 2)) AND (z > 0)) AND (b = y)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2) AND y > 0 AND z = c
----
lookup join not possible

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
y = b AND z > 0
optional: x IN (1, 2)
----
lookup expression:
  ((x IN (1, 2)) AND (z > 0)) AND (b = y)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y)
y = b AND z > 0
optional: x IN (1, 2)
----
lookup expression:
  (x IN (1, 2)) AND (b = y)
remaining filters:
  z > 0

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y)
y = b
optional: x IN (1, 2) AND z > 0
----
lookup expression:
  (x IN (1, 2)) AND (b = y)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x IN (10, 20, 30, 40) AND y = b AND x > 10
----
lookup expression:
  (x IN (20, 30, 40)) AND (b = y)

lookup-constraints left=(a int) right=(x int, y int, z int) index=(x, y, z)
x IN (1, 2) AND y = a
optional: z > 10
----
lookup expression:
  (x IN (1, 2)) AND (a = y)

lookup-constraints left=(a int, b int) right=(x int, y int, z int, zz int) index=(x, y, z, zz)
x IN (1, 2) AND y = b
optional: z IN (10, 20, 30) AND zz > 0
----
lookup expression:
  (x IN (1, 2)) AND (b = y)

# Test for range filters on input columns.

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x > a
----
lookup expression:
  x > a

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x >= a
----
lookup expression:
  x >= a

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x < a
----
lookup expression:
  x < a

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x <= a
----
lookup expression:
  x <= a

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x = a AND y > b
----
lookup expression:
  (y > b) AND (a = x)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x = a AND y >= b
----
lookup expression:
  (y >= b) AND (a = x)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x = a AND y < b
----
lookup expression:
  (y < b) AND (a = x)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
x = a AND y <= b
----
lookup expression:
  (y <= b) AND (a = x)

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x desc, y)
x > a
----
lookup expression:
  x > a

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x desc, y)
x >= a
----
lookup expression:
  x >= a

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x desc, y)
x < a
----
lookup expression:
  x < a

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x desc, y)
x <= a
----
lookup expression:
  x <= a

lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x, y)
x > a
----
lookup expression:
  x > a

lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x, y)
x >= a
----
lookup expression:
  x >= a

lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x, y)
x < a
----
lookup expression:
  x < a

lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x, y)
x <= a
----
lookup expression:
  x <= a

lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x desc, y)
x > a
----
lookup expression:
  x > a

lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x desc, y)
x >= a
----
lookup expression:
  x >= a

# A '<' filter on a descending index column would require a call to Prev, which
# is not possible for DECIMAL values.
lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x desc, y)
x < a
----
lookup join not possible

lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x desc, y)
x <= a
----
lookup expression:
  x <= a

# A '<' filter on a descending index column would require a call to Prev, which
# is not possible for DECIMAL values. Leave the '<' condition in the remaining
# filters.
lookup-constraints left=(a decimal, b decimal) right=(x decimal, y decimal) index=(x, y desc)
x = a AND y < b
----
key cols:
  x = a
remaining filters:
  y < b

lookup-constraints left=(a float, b float) right=(x float, y float) index=(x, y)
x > a
----
lookup expression:
  x > a

lookup-constraints left=(a float, b float) right=(x float, y float) index=(x, y)
x >= a
----
lookup expression:
  x >= a

lookup-constraints left=(a float, b float) right=(x float, y float) index=(x, y)
x < a
----
lookup expression:
  x < a

lookup-constraints left=(a float, b float) right=(x float, y float) index=(x, y)
x <= a
----
lookup expression:
  x <= a

lookup-constraints left=(a float, b float) right=(x float, y float) index=(x desc, y)
x > a
----
lookup expression:
  x > a

lookup-constraints left=(a float, b float) right=(x float, y float) index=(x desc, y)
x >= a
----
lookup expression:
  x >= a

# Similar to integers, floats support Datum.Prev, so a lookup can be performed with
# this filter and index.
lookup-constraints left=(a float, b float) right=(x float, y float) index=(x desc, y)
x < a
----
lookup expression:
  x < a

lookup-constraints left=(a float, b float) right=(x float, y float) index=(x desc, y)
x <= a
----
lookup expression:
  x <= a

lookup-constraints left=(a int, b int) right=(x int, y int) index=(x, y)
y > b
optional: x IN (10, 20, 30)
----
lookup expression:
  (x IN (10, 20, 30)) AND (y > b)

lookup-constraints left=(a int, b int, c int) right=(x int, y int, z int) index=(x, y, z)
x = a AND z > b
optional: y IN (10, 20, 30)
----
lookup expression:
  ((y IN (10, 20, 30)) AND (z > b)) AND (a = x)
