[
  {
    "Name": "TestCompIndexInExprCorrCol",
    "Cases": [
      {
        "SQL": "explain select t.e in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c in (1, 2) and s.d = t.a and s.a = t1.a) from t",
        "Result": [
          "Projection_14 2.00 root  Column#27",
          "└─Apply_16 2.00 root  CARTESIAN left outer semi join, other cond:eq(test.t.e, Column#26)",
          "  ├─TableReader_18(Build) 2.00 root  data:TableFullScan_17",
          "  │ └─TableFullScan_17 2.00 cop[tikv] table:t keep order:false",
          "  └─StreamAgg_20(Probe) 1.00 root  funcs:count(1)->Column#26",
          "    └─IndexJoin_36 2.00 root  inner join, inner:TableReader_35, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a)",
          "      ├─IndexReader_29(Build) 2.00 root  index:IndexRangeScan_28",
          "      │ └─IndexRangeScan_28 2.00 cop[tikv] table:s, index:idx(b, c, d) range: decided by [eq(test.t.b, 1) in(test.t.c, 1, 2) eq(test.t.d, test.t.a)], keep order:false",
          "      └─TableReader_35(Probe) 1.00 root  data:TableRangeScan_34",
          "        └─TableRangeScan_34 1.00 cop[tikv] table:t1 range: decided by [test.t.a], keep order:false"
        ]
      },
      {
        "SQL": "select t.e in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c in (1, 2) and s.d = t.a and s.a = t1.a) from t",
        "Result": [
          "1",
          "1"
        ]
      }
    ]
  },
  {
    "Name": "TestIndexStringIsTrueRange",
    "Cases": [
      {
        "SQL": "explain select * from t0 where c0",
        "Result": [
          "TableReader_7 0.80 root  data:Selection_6",
          "└─Selection_6 0.80 cop[tikv]  test.t0.c0",
          "  └─TableFullScan_5 1.00 cop[tikv] table:t0 keep order:false"
        ]
      },
      {
        "SQL": "explain select * from t0 where c0 and c0 > '123'",
        "Result": [
          "IndexReader_7 1.00 root  index:Selection_6",
          "└─Selection_6 1.00 cop[tikv]  test.t0.c0",
          "  └─IndexRangeScan_5 1.00 cop[tikv] table:t0, index:i0(c0) range:(\"123\",+inf], keep order:false"
        ]
      },
      {
        "SQL": "explain select * from t0 where c0 and c0 <> '123'",
        "Result": [
          "IndexReader_7 1.00 root  index:Selection_6",
          "└─Selection_6 1.00 cop[tikv]  test.t0.c0",
          "  └─IndexRangeScan_5 1.00 cop[tikv] table:t0, index:i0(c0) range:[-inf,\"123\"), (\"123\",+inf], keep order:false"
        ]
      },
      {
        "SQL": "explain select * from t0 where c0 is true",
        "Result": [
          "TableReader_7 0.80 root  data:Selection_6",
          "└─Selection_6 0.80 cop[tikv]  istrue(cast(test.t0.c0))",
          "  └─TableFullScan_5 1.00 cop[tikv] table:t0 keep order:false"
        ]
      },
      {
        "SQL": "explain select * from t0 where c0 is false",
        "Result": [
          "TableReader_7 0.80 root  data:Selection_6",
          "└─Selection_6 0.80 cop[tikv]  isfalse(cast(test.t0.c0))",
          "  └─TableFullScan_5 1.00 cop[tikv] table:t0 keep order:false"
        ]
      },
      {
        "SQL": "explain select * from t0 where c0 and c0 in ('123','456','789')",
        "Result": [
          "IndexReader_7 1.00 root  index:Selection_6",
          "└─Selection_6 1.00 cop[tikv]  test.t0.c0",
          "  └─IndexRangeScan_5 1.00 cop[tikv] table:t0, index:i0(c0) range:[\"123\",\"123\"], [\"456\",\"456\"], [\"789\",\"789\"], keep order:false"
        ]
      },
      {
        "SQL": "explain SELECT * FROM t0 WHERE ('a' != t0.c0) AND t0.c0;",
        "Result": [
          "IndexReader_7 1.00 root  index:Selection_6",
          "└─Selection_6 1.00 cop[tikv]  test.t0.c0",
          "  └─IndexRangeScan_5 1.00 cop[tikv] table:t0, index:i0(c0) range:[-inf,\"a\"), (\"a\",+inf], keep order:false"
        ]
      }
    ]
  },
  {
    "Name": "TestPrefixIndexMultiColDNF",
    "Cases": [
      {
        "SQL": "select * from t2 where t='aaaa';",
        "Plan": [
          "IndexLookUp_11 10.00 root  ",
          "├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t2, index:t(t) range:[\"aaa\",\"aaa\"], keep order:false, stats:pseudo",
          "└─Selection_10(Probe) 10.00 cop[tikv]  eq(test.t2.t, \"aaaa\")",
          "  └─TableRowIDScan_9 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo"
        ],
        "Result": [
          "1 aaaa"
        ]
      },
      {
        "SQL": "select * from t2 where t='aaaa' or t = 'a';",
        "Plan": [
          "IndexLookUp_11 16.00 root  ",
          "├─IndexRangeScan_8(Build) 20.00 cop[tikv] table:t2, index:t(t) range:[\"a\",\"a\"], [\"aaa\",\"aaa\"], keep order:false, stats:pseudo",
          "└─Selection_10(Probe) 16.00 cop[tikv]  or(eq(test.t2.t, \"aaaa\"), eq(test.t2.t, \"a\"))",
          "  └─TableRowIDScan_9 20.00 cop[tikv] table:t2 keep order:false, stats:pseudo"
        ],
        "Result": [
          "1 aaaa",
          "2 a"
        ]
      },
      {
        "SQL": "select * from t2 where t='aaaa';",
        "Plan": [
          "TableReader_7 1.00 root  data:Selection_6",
          "└─Selection_6 1.00 cop[tikv]  eq(test.t2.t, \"aaaa\")",
          "  └─TableRangeScan_5 2.00 cop[tikv] table:t2 range:[0,+inf], keep order:false"
        ],
        "Result": [
          "1 aaaa"
        ]
      },
      {
        "SQL": "select * from t2 where t='aaaa' or t = 'a';",
        "Plan": [
          "TableReader_7 1.60 root  data:Selection_6",
          "└─Selection_6 1.60 cop[tikv]  or(eq(test.t2.t, \"aaaa\"), eq(test.t2.t, \"a\"))",
          "  └─TableRangeScan_5 2.00 cop[tikv] table:t2 range:[0,+inf], keep order:false"
        ],
        "Result": [
          "1 aaaa",
          "2 a"
        ]
      }
    ]
  }
]
