>From Ritik Raj <[email protected]>:

Ritik Raj has uploaded this change for review. ( 
https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20992?usp=email )


Change subject: [ASTERIXDB-3708][COMP] Fix range-filter pushdown with secondary 
index intersection
......................................................................

[ASTERIXDB-3708][COMP] Fix range-filter pushdown with secondary index 
intersection

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
When querying a columnar dataset with multiple secondary indexes (causing
an INTERSECT-based intersection plan), range-filter pushdown was silently
skipped, e.g.:

  SELECT count(*) FROM A WHERE b = 0 AND a = 1 AND c = 4

with indexes on (a), (b), (c) produced an INTERSECT plan where the
range-filter was not pushed into the primary scan.

Root cause: The ASTERIXDB-3708 fix (46d36883bf) introduced a registration
ordering constraint: registerDatasetIfApplicable must run before visitInputs
so that a pushed-down selectCondition can link its field accesses to the
scan's record variable in the def-use chain. However, this caused a scope
mismatch: the scan was registered before the INTERSECT (a scope-bumping
operator) in its input subtree was visited, so the scan's scope was lower
than the SELECT operator above it, causing canPushSelect to reject the
pushdown.

The two constraints conflict:
- Def-use correctness: register BEFORE processing the scan's own expressions
- Scope correctness:   register AFTER visiting the input subtree (so all
  scope-bumping operators have already advanced the counter)

Fix: Split visitInputs into visitChildren + processOperator, exposing
the boundary between the two phases. The three scan visitors
(DataSourceScan, UnnestMap, LeftOuterUnnestMap) now explicitly do:

  visitChildren → registerDatasetIfApplicable → processOperator

This satisfies both constraints: the scope counter is fully advanced
before registration, and registration precedes expression processing.

Ext-ref: MB-70725
Change-Id: I7a06aa40f43358a6ef3e5773c8d02c5928eb8007
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.001.ddl.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.002.update.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.003.query.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.004.query.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.005.ddl.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/results/column/secondary-index/range-filter-intersect/range-filter-intersect.003.plan
A 
asterixdb/asterix-app/src/test/resources/runtimets/results/column/secondary-index/range-filter-intersect/range-filter-intersect.004.adm
M 
asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml
9 files changed, 272 insertions(+), 3 deletions(-)



  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/92/20992/1

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
index 7878ebf..5b7c039 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/pushdown/visitor/PushdownOperatorVisitor.java
@@ -122,9 +122,27 @@
         if (visitedOperators.contains(op)) {
             return;
         }
+        visitChildren(op);
+        processOperator(op, producedVariables);
+    }
+
+    /**
+     * Visits all children of an operator. Scope-bumping operators (e.g., 
INTERSECT, JOIN) encountered in the
+     * subtree will advance the scope counter as a side effect.
+     */
+    private void visitChildren(ILogicalOperator op) throws AlgebricksException 
{
         for (Mutable<ILogicalOperator> child : op.getInputs()) {
             child.getValue().accept(this, null);
         }
+    }
+
+    /**
+     * Processes the operator itself: enters its scope, builds the def-use 
chain for its expressions, and marks it
+     * as visited. Must be called after {@link #visitChildren} and after any 
dataset registration so that
+     * expressions referencing the scan's record variable are correctly linked 
in the def-use chain.
+     */
+    private void processOperator(ILogicalOperator op, List<LogicalVariable> 
producedVariables)
+            throws AlgebricksException {
         visitedOperators.add(op);
         // Enter scope for (new stage) for operators like GROUP and JOIN
         pushdownContext.enterScope(op);
@@ -163,21 +181,35 @@
      */
     @Override
     public Void visitDataScanOperator(DataSourceScanOperator op, Void arg) 
throws AlgebricksException {
+        if (visitedOperators.contains(op)) {
+            return null;
+        }
+        visitChildren(op);
         DatasetDataSource datasetDataSource = 
getDatasetDataSourceIfApplicable((DataSource) op.getDataSource());
         registerDatasetIfApplicable(datasetDataSource, op);
-        visitInputs(op);
+        processOperator(op, null);
         return null;
     }

     /**
      * From the {@link UnnestMapOperator}, we need to register the payload 
variable (record variable) to check
      * which expression in the plan is using it.
+     * <p>
+     * Registration must happen after visiting children (so that any 
scope-bumping operators in the input subtree,
+     * e.g. an INTERSECT used for secondary-index intersection, have already 
advanced the scope counter) but before
+     * processing the operator's own expressions (so that the scan's record 
variable is in the def-use chain when
+     * the selectCondition — which may have been pushed into the UNNEST_MAP by 
PushLimitIntoPrimarySearchRule — is
+     * processed).
      */
     @Override
     public Void visitUnnestMapOperator(UnnestMapOperator op, Void arg) throws 
AlgebricksException {
+        if (visitedOperators.contains(op)) {
+            return null;
+        }
+        visitChildren(op);
         DatasetDataSource datasetDataSource = 
getDatasetDataSourceIfApplicable(getDataSourceFromUnnestMapOperator(op));
         registerDatasetIfApplicable(datasetDataSource, op);
-        visitInputs(op);
+        processOperator(op, null);
         return null;
     }

@@ -187,9 +219,13 @@
      */
     @Override
     public Void visitLeftOuterUnnestMapOperator(LeftOuterUnnestMapOperator op, 
Void arg) throws AlgebricksException {
+        if (visitedOperators.contains(op)) {
+            return null;
+        }
+        visitChildren(op);
         DatasetDataSource datasetDataSource = 
getDatasetDataSourceIfApplicable(getDataSourceFromUnnestMapOperator(op));
         registerDatasetIfApplicable(datasetDataSource, op);
-        visitInputs(op);
+        processOperator(op, null);
         return null;
     }

diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.001.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.001.ddl.sqlpp
new file mode 100644
index 0000000..64f2d37
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.001.ddl.sqlpp
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Regression test for ASTERIXDB-3708 (scope fix):
+ * Range-filter pushdown must be applied to the primary scan even when the
+ * query plan uses a secondary-index INTERSECT (multiple secondary index
+ * lookups joined via INTERSECT before the primary BTREE_SEARCH).
+ *
+ * Before the fix the INTERSECT operator bumped the scope counter before the
+ * primary scan was registered, causing scope(SELECT) != scope(scan) and
+ * silently suppressing the range-filter pushdown.
+ */
+
+DROP DATAVERSE range_filter_intersect IF EXISTS;
+CREATE DATAVERSE range_filter_intersect;
+USE range_filter_intersect;
+
+CREATE TYPE intType AS {
+    id: integer
+};
+
+CREATE DATASET A(intType) PRIMARY KEY id WITH {
+    "storage-format": {"format": "column"}
+};
+
+CREATE INDEX idx_b ON A (b);
+CREATE INDEX idx_a ON A (a);
+CREATE INDEX idx_c ON A (c);
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.002.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.002.update.sqlpp
new file mode 100644
index 0000000..b81299c
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.002.update.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE range_filter_intersect;
+
+-- Only {id:1} matches all three conditions: b=0, a=1, c=4
+INSERT INTO A {"id": 1, "a": 1, "b": 0, "c": 4};
+INSERT INTO A {"id": 2, "a": 2, "b": 0, "c": 4};
+INSERT INTO A {"id": 3, "a": 1, "b": 1, "c": 4};
+INSERT INTO A {"id": 4, "a": 1, "b": 0, "c": 5};
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.003.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.003.query.sqlpp
new file mode 100644
index 0000000..aebacd5
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.003.query.sqlpp
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Verifies that range-filter on: appears on the primary BTREE_SEARCH when
+ * the plan uses a secondary-index INTERSECT below it.
+ */
+USE range_filter_intersect;
+SET `compiler.parallelism` "0";
+SET `compiler.sort.parallel` "false";
+EXPLAIN
+SELECT count(*)
+FROM A
+WHERE b = 0
+  AND a = 1
+  AND c = 4;
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.004.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.004.query.sqlpp
new file mode 100644
index 0000000..3989ca9
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.004.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE range_filter_intersect;
+
+SELECT count(*)
+FROM A
+WHERE b = 0
+  AND a = 1
+  AND c = 4;
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.005.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.005.ddl.sqlpp
new file mode 100644
index 0000000..ce0180f
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/column/secondary-index/range-filter-intersect/range-filter-intersect.005.ddl.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE range_filter_intersect IF EXISTS;
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/secondary-index/range-filter-intersect/range-filter-intersect.003.plan
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/secondary-index/range-filter-intersect/range-filter-intersect.003.plan
new file mode 100644
index 0000000..2e8b713
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/secondary-index/range-filter-intersect/range-filter-intersect.003.plan
@@ -0,0 +1,78 @@
+distribute result [$$41] [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    assign [$$41] <- [{"$1": $$43}] project: [$$41] [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+    -- ASSIGN  |UNPARTITIONED|
+      aggregate [$$43] <- [agg-sql-sum($$47)] [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
+      -- AGGREGATE  |UNPARTITIONED|
+        exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 
0.0]
+        -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+          aggregate [$$47] <- [agg-sql-count(1)] [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
+          -- AGGREGATE  |PARTITIONED|
+            select (and(eq($$A.getField("b"), 0), eq($$A.getField("a"), 1), 
eq($$A.getField("c"), 4))) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+            -- STREAM_SELECT  |PARTITIONED|
+              project ([$$A]) [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+              -- STREAM_PROJECT  |PARTITIONED|
+                exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  unnest-map [$$42, $$A] <- index-search("A", 0, "Default", 
"range_filter_intersect", "A", false, false, 1, $$60, 1, $$60, true, true, 
true) project ({a:any,b:any,c:any}) range-filter on: and(eq($$A.getField("b"), 
0), eq($$A.getField("a"), 1), eq($$A.getField("c"), 4)) [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                  -- BTREE_SEARCH  |PARTITIONED|
+                    exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, 
total-cost: 0.0]
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      intersect [$$60] <- [[$$51], [$$55], [$$59]] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                      -- INTERSECT  |PARTITIONED|
+                        exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          order (ASC, $$51) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                          -- STABLE_SORT [$$51(ASC)]  |PARTITIONED|
+                            exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              project ([$$51]) [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  unnest-map [$$50, $$51] <- 
index-search("idx_a", 0, "Default", "range_filter_intersect", "A", false, 
false, 1, $$48, 1, $$49, true, true, true) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      assign [$$48, $$49] <- [1, 1] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- ASSIGN  |PARTITIONED|
+                                        empty-tuple-source [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          order (ASC, $$55) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                          -- STABLE_SORT [$$55(ASC)]  |PARTITIONED|
+                            exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              project ([$$55]) [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  unnest-map [$$54, $$55] <- 
index-search("idx_b", 0, "Default", "range_filter_intersect", "A", false, 
false, 1, $$52, 1, $$53, true, true, true) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      assign [$$52, $$53] <- [0, 0] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- ASSIGN  |PARTITIONED|
+                                        empty-tuple-source [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        exchange [cardinality: 0.0, doc-size: 0.0, op-cost: 
0.0, total-cost: 0.0]
+                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                          order (ASC, $$59) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                          -- STABLE_SORT [$$59(ASC)]  |PARTITIONED|
+                            exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              project ([$$59]) [cardinality: 0.0, doc-size: 
0.0, op-cost: 0.0, total-cost: 0.0]
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  unnest-map [$$58, $$59] <- 
index-search("idx_c", 0, "Default", "range_filter_intersect", "A", false, 
false, 1, $$56, 1, $$57, true, true, true) [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    exchange [cardinality: 0.0, doc-size: 0.0, 
op-cost: 0.0, total-cost: 0.0]
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      assign [$$56, $$57] <- [4, 4] 
[cardinality: 0.0, doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                      -- ASSIGN  |PARTITIONED|
+                                        empty-tuple-source [cardinality: 0.0, 
doc-size: 0.0, op-cost: 0.0, total-cost: 0.0]
+                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/column/secondary-index/range-filter-intersect/range-filter-intersect.004.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/secondary-index/range-filter-intersect/range-filter-intersect.004.adm
new file mode 100644
index 0000000..7cc3573
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/column/secondary-index/range-filter-intersect/range-filter-intersect.004.adm
@@ -0,0 +1 @@
+{ "$1": 1 }
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml
 
b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml
index d0a8452..27bd8f9 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_single_partition_sqlpp.xml
@@ -410,6 +410,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="column">
+      <compilation-unit name="secondary-index/range-filter-intersect">
+        <output-dir 
compare="Text">secondary-index/range-filter-intersect</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="column">
       <compilation-unit name="secondary-index/array-index/use-case-1">
         <output-dir 
compare="Text">secondary-index/array-index/use-case-1</output-dir>
       </compilation-unit>

--
To view, visit https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20992?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://asterix-gerrit.ics.uci.edu/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: asterixdb
Gerrit-Branch: phoenix
Gerrit-Change-Id: I7a06aa40f43358a6ef3e5773c8d02c5928eb8007
Gerrit-Change-Number: 20992
Gerrit-PatchSet: 1
Gerrit-Owner: Ritik Raj <[email protected]>

Reply via email to