@@ -8752,4 +8752,42 @@ def test_MB66955(self):
87528752 WHERE type = "abc" AND IS_OBJECT(o1)
87538753 '''
87548754 # Just verify query does not fail
8755- self.run_cbq_query(explain_query, query_context=query_context)
8755+ self.run_cbq_query(explain_query, query_context=query_context)
8756+
8757+ def test_MB63163(self):
8758+ """
8759+ MB-63163: Sargable index not sarged for OUTER JOIN with array predicate in ON clause
8760+ This test creates a new collection in default._default, sets up the array index and data as in the JIRA,
8761+ and asserts that the queries with LEFT JOIN and ANY clause succeed with no plan error.
8762+ """
8763+ self.fail_if_no_buckets()
8764+ collection_name = "mb63163"
8765+ query_context = "default._default"
8766+ # Create collection
8767+ self.run_cbq_query(f"CREATE COLLECTION {collection_name} IF NOT EXISTS", query_context=query_context)
8768+ self.sleep(2)
8769+ # Create array index as in JIRA
8770+ self.run_cbq_query(f"CREATE INDEX ix20 ON {collection_name}(ALL a1) WHERE type = 'docs'", query_context=query_context)
8771+ # Insert documents
8772+ self.run_cbq_query(f"INSERT INTO {collection_name} (KEY, VALUE) VALUES ('2345234', {{'type':'docs', 'test':1}})", query_context=query_context)
8773+ self.run_cbq_query(f"INSERT INTO {collection_name} (KEY, VALUE) VALUES ('d2id', {{'type':'docs', 'id':'d2id', 'c2':'val', 'a1':['2345234']}})", query_context=query_context)
8774+ self.run_cbq_query(f"INSERT INTO {collection_name} (KEY, VALUE) VALUES ('d2id2', {{'type':'docs', 'id':'d2id2', 'c2':'val2', 'a1':['notmatch']}})", query_context=query_context)
8775+ # Query 1: LEFT JOIN with ANY in ON clause
8776+ query1 = f"""
8777+ SELECT d1, d2.id, d2.c2
8778+ FROM {collection_name} AS d1 USE KEYS '2345234'
8779+ LEFT JOIN {collection_name} AS d2 ON d2.type = 'docs' AND ANY id IN d2.a1 SATISFIES id = META(d1).id END
8780+ """
8781+ result1 = self.run_cbq_query(query1, query_context=query_context)
8782+ self.assertIn('status', result1)
8783+ self.assertEqual(result1['status'], 'success', f"Query 1 failed: {result1}")
8784+ # Query 2: Same with WHERE d1.test = 1
8785+ query2 = f"""
8786+ SELECT d1, d2.id, d2.c2
8787+ FROM {collection_name} AS d1 USE KEYS '2345234'
8788+ LEFT JOIN {collection_name} AS d2 ON d2.type = 'docs' AND ANY id IN d2.a1 SATISFIES id = META(d1).id END
8789+ WHERE d1.test = 1
8790+ """
8791+ result2 = self.run_cbq_query(query2, query_context=query_context)
8792+ self.assertIn('status', result2)
8793+ self.assertEqual(result2['status'], 'success', f"Query 2 failed: {result2}")
0 commit comments