This is an automated email from the ASF dual-hosted git repository.

preetham02 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new f2b2bf9830 [ASTERIXDB-3673]: Fix: Prevent CBO failure when samples are 
empty
f2b2bf9830 is described below

commit f2b2bf983028b0967a251234915b4acf9faf4084
Author: Janhavi Tripurwar <[email protected]>
AuthorDate: Thu Nov 13 22:33:55 2025 +0530

    [ASTERIXDB-3673]: Fix: Prevent CBO failure when samples are empty
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - Fallback to RBO when samples are empty.
    - Moved issueWarning method to ExceptionUtil for better accessibility.
    - Added warning log for visibility.
    
    Ext-ref: MB-69358
    
    Change-Id: Iad996433d22308f8f4096e30a0b04be27c58c020
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/20572
    Integration-Tests: Jenkins <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
    Tested-by: Janhavi Tripurwar <[email protected]>
---
 .../asterix/optimizer/rules/cbo/EnumerateJoinsRule.java  |  8 ++++++++
 .../org/apache/asterix/optimizer/rules/cbo/Stats.java    | 16 +++-------------
 .../ddl/analyze-dataset-1/analyze-dataset-1.1.ddl.sqlpp  |  5 +++++
 .../src/test/resources/runtimets/sqlpp_queries.xml       |  3 ++-
 .../org/apache/asterix/om/exceptions/ExceptionUtil.java  | 11 +++++++++++
 5 files changed, 29 insertions(+), 14 deletions(-)

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
index d053c19638..7aa2e8b2bb 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/EnumerateJoinsRule.java
@@ -32,6 +32,7 @@ import 
org.apache.asterix.common.metadata.DatasetFullyQualifiedName;
 import org.apache.asterix.metadata.declared.DatasetDataSource;
 import org.apache.asterix.metadata.declared.IIndexProvider;
 import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.om.exceptions.ExceptionUtil;
 import org.apache.asterix.optimizer.rules.cbo.indexadvisor.AdvisorPlanParser;
 import org.apache.asterix.optimizer.rules.cbo.indexadvisor.CBOPlanStateTree;
 import org.apache.asterix.optimizer.rules.cbo.indexadvisor.FakeIndexProvider;
@@ -1621,8 +1622,15 @@ public class EnumerateJoinsRule implements 
IAlgebraicRewriteRule {
             if (index == null) {
                 return false;
             }
+            Index.SampleIndexDetails idxDetails = (Index.SampleIndexDetails) 
index.getIndexDetails();
+            double origDatasetCard = idxDetails.getSourceCardinality();
+            if (origDatasetCard == 0) {
+                ExceptionUtil.warnEmptySamples(origDatasetCard, 
scanOp.getSourceLocation(), context);
+                return false;
+            }
             n++;
         }
+
         return (leafInputs.size() == n);
     }
 
diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
index 72ec179e93..5b567de11e 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/cbo/Stats.java
@@ -39,6 +39,7 @@ import org.apache.asterix.om.base.AInt64;
 import org.apache.asterix.om.base.ARecord;
 import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.om.constants.AsterixConstantValue;
+import org.apache.asterix.om.exceptions.ExceptionUtil;
 import org.apache.asterix.om.functions.BuiltinFunctionInfo;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.optimizer.base.AnalysisUtil;
@@ -638,17 +639,6 @@ public class Stats {
         }
     }
 
-    protected void issueWarning(double sampleCard, DataSourceScanOperator 
scanOp) {
-        if (sampleCard == 0) {
-            sampleCard = 1;
-            IWarningCollector warningCollector = optCtx.getWarningCollector();
-            if (warningCollector.shouldWarn()) {
-                warningCollector.warn(Warning.of(scanOp.getSourceLocation(),
-                        
org.apache.asterix.common.exceptions.ErrorCode.SAMPLE_HAS_ZERO_ROWS));
-            }
-        }
-    }
-
     protected double findSelectivityForThisPredicate(SelectOperator selOp, 
AbstractFunctionCallExpression exp,
             boolean arrayIndex) throws AlgebricksException {
         // replace the SelOp.condition with the new exp and replace it at the 
end
@@ -669,7 +659,7 @@ public class Stats {
         Index.SampleIndexDetails idxDetails = (Index.SampleIndexDetails) 
index.getIndexDetails();
         double origDatasetCard = idxDetails.getSourceCardinality();
         double sampleCard = Math.min(idxDetails.getSampleCardinalityTarget(), 
origDatasetCard);
-        issueWarning(sampleCard, scanOp);
+        ExceptionUtil.warnEmptySamples(sampleCard, scanOp.getSourceLocation(), 
optCtx);
 
         // replace the dataScanSourceOperator with the sampling source
         SampleDataSource sampledatasource = 
joinEnum.getSampleDataSource(scanOp);
@@ -874,7 +864,7 @@ public class Stats {
         Index.SampleIndexDetails idxDetails = (Index.SampleIndexDetails) 
index.getIndexDetails();
         double origDatasetCard = idxDetails.getSourceCardinality();
         double sampleCard = Math.min(idxDetails.getSampleCardinalityTarget(), 
origDatasetCard);
-        issueWarning(sampleCard, scanOp);
+        ExceptionUtil.warnEmptySamples(sampleCard, scanOp.getSourceLocation(), 
optCtx);
         return index;
     }
 
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.1.ddl.sqlpp
index e1d6b1020e..9e3d85f43b 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.1.ddl.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/ddl/analyze-dataset-1/analyze-dataset-1.1.ddl.sqlpp
@@ -21,6 +21,8 @@
  * Description: Test ANALYZE DATASET statement
  */
 
+// param max-warnings:json=1
+
 set `import-private-functions` `true`;
 
 drop dataverse test if exists;
@@ -54,3 +56,6 @@ create dataset ds1(t1) primary key id;
 -- analyze on an empty dataset
 
 analyze dataset ds1;
+
+-- issue a warning for empty samples
+select * from ds1;
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml 
b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
index c157213f15..f8d415b1fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -4302,9 +4302,10 @@
         <output-dir compare="Clean-JSON">create-dataset-4</output-dir>
       </compilation-unit>
     </test-case>
-    <test-case FilePath="ddl">
+    <test-case FilePath="ddl" check-warnings="true">
       <compilation-unit name="analyze-dataset-1">
         <output-dir compare="Text">analyze-dataset-1</output-dir>
+          <expected-warn>ASX1174: Sample has zero rows</expected-warn>
       </compilation-unit>
     </test-case>
     <test-case FilePath="ddl">
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/ExceptionUtil.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/ExceptionUtil.java
index 24909d71e7..ebfdb54248 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/ExceptionUtil.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/ExceptionUtil.java
@@ -28,6 +28,7 @@ import java.util.function.Supplier;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.EnumDeserializer;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.api.context.IEvaluatorContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -173,6 +174,16 @@ public final class ExceptionUtil {
         }
     }
 
+    public static void warnEmptySamples(double sampleCard, SourceLocation 
sourceLocation, IOptimizationContext optCtx) {
+        if (sampleCard == 0) {
+            IWarningCollector warningCollector = optCtx.getWarningCollector();
+            if (warningCollector.shouldWarn()) {
+                warningCollector.warn(Warning.of(sourceLocation,
+                        
org.apache.asterix.common.exceptions.ErrorCode.SAMPLE_HAS_ZERO_ROWS));
+            }
+        }
+    }
+
     public static boolean isStringUnicodeError(HyracksDataException throwable) 
{
         return isErrorCode(throwable, INVALID_STRING_UNICODE);
     }

Reply via email to