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);
}