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

alsuliman 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 02ca83841a [ASTERIXDB-3537][COMP] Follow-up patch to support truncate
02ca83841a is described below

commit 02ca83841ad3ea40f2be4b94f89a6b98c870dd2a
Author: Ali Alsuliman <[email protected]>
AuthorDate: Mon Mar 3 20:41:38 2025 -0800

    [ASTERIXDB-3537][COMP] Follow-up patch to support truncate
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - prevent truncate on datasets with meta records
    
    Ext-ref: MB-63067
    
    Change-Id: I6940bafaddfef4d6e79093781dff506dc064cd0c
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19487
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
    Reviewed-by: Murtadha Hubail <[email protected]>
---
 .../translator/LangExpressionToPlanTranslator.java  | 20 ++++++++++----------
 .../asterix/app/translator/QueryTranslator.java     | 14 ++++++++++++--
 .../test/cloud_storage/RetryingQueryTranslator.java |  5 ++---
 ...01.ddl.sqlpp => truncate-dataset-1.01.ddl.sqlpp} |  0
 ...ate.sqlpp => truncate-dataset-1.02.update.sqlpp} |  0
 ...uery.sqlpp => truncate-dataset-1.03.query.sqlpp} |  0
 ...uery.sqlpp => truncate-dataset-1.04.query.sqlpp} |  0
 ...uery.sqlpp => truncate-dataset-1.05.query.sqlpp} |  0
 ...06.ddl.sqlpp => truncate-dataset-1.06.ddl.sqlpp} |  0
 ...uery.sqlpp => truncate-dataset-1.07.query.sqlpp} |  0
 ...uery.sqlpp => truncate-dataset-1.08.query.sqlpp} |  0
 ...uery.sqlpp => truncate-dataset-1.09.query.sqlpp} |  0
 ...10.ddl.sqlpp => truncate-dataset-1.10.ddl.sqlpp} |  0
 .../src/test/resources/runtimets/sqlpp_queries.xml  |  8 ++++----
 .../apache/asterix/common/exceptions/ErrorCode.java |  1 +
 .../src/main/resources/asx_errormsg/en.properties   |  3 ++-
 .../common/statement/TruncateDatasetStatement.java  | 21 ++++++++++++++++-----
 .../lang/sqlpp/rewrites/SqlppStatementRewriter.java |  1 +
 .../sqlpp/visitor/SqlppSynonymRewriteVisitor.java   | 15 ++++++++++++++-
 .../asterix-lang-sqlpp/src/main/javacc/SQLPP.jj     |  4 ++--
 .../apache/asterix/metadata/utils/DatasetUtil.java  |  4 +++-
 21 files changed, 67 insertions(+), 29 deletions(-)

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index f8d0ff69da..a3e467eca5 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -222,8 +222,8 @@ abstract class LangExpressionToPlanTranslator
                 stmt.getDataverseName(), stmt.getDatasetName(), sourceLoc);
         List<List<String>> partitionKeys = 
targetDatasource.getDataset().getPrimaryKeys();
         if (dataset.hasMetaPart()) {
-            throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, 
sourceLoc, dataset.getDatasetName(),
-                    stmt.getKind() == Statement.Kind.LOAD ? "load" : "copy 
into");
+            throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, 
sourceLoc,
+                    stmt.getKind() == Statement.Kind.LOAD ? "load" : "copy 
into", dataset.getDatasetName());
         }
 
         LoadableDataSource lds;
@@ -615,8 +615,8 @@ abstract class LangExpressionToPlanTranslator
             ICompiledDmlStatement stmt) throws AlgebricksException {
         SourceLocation sourceLoc = stmt.getSourceLocation();
         if (targetDatasource.getDataset().hasMetaPart()) {
-            throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, 
sourceLoc,
-                    targetDatasource.getDataset().getDatasetName(), "delete 
from");
+            throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, 
sourceLoc, "delete from",
+                    targetDatasource.getDataset().getDatasetName());
         }
 
         List<String> filterField = 
DatasetUtil.getFilterField(targetDatasource.getDataset());
@@ -645,8 +645,8 @@ abstract class LangExpressionToPlanTranslator
             IResultMetadata resultMetadata) throws AlgebricksException {
         SourceLocation sourceLoc = stmt.getSourceLocation();
         if (!targetDatasource.getDataset().allow(topOp, 
DatasetUtil.OP_UPSERT)) {
-            throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, 
sourceLoc,
-                    targetDatasource.getDataset().getDatasetName(), "upsert 
into");
+            throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, 
sourceLoc, "upsert into",
+                    targetDatasource.getDataset().getDatasetName());
         }
         ProjectOperator project = (ProjectOperator) topOp;
         CompiledUpsertStatement compiledUpsert = (CompiledUpsertStatement) 
stmt;
@@ -657,8 +657,8 @@ abstract class LangExpressionToPlanTranslator
 
         if (targetDatasource.getDataset().hasMetaPart()) {
             if (returnExpression != null) {
-                throw new 
CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, sourceLoc,
-                        targetDatasource.getDataset().getDatasetName(), 
"return expression");
+                throw new 
CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, sourceLoc, "return 
expression",
+                        targetDatasource.getDataset().getDatasetName());
             }
             List<LogicalVariable> metaAndKeysVars;
             List<Mutable<ILogicalExpression>> metaAndKeysExprs;
@@ -768,8 +768,8 @@ abstract class LangExpressionToPlanTranslator
             ICompiledDmlStatement stmt, IResultMetadata resultMetadata) throws 
AlgebricksException {
         SourceLocation sourceLoc = stmt.getSourceLocation();
         if (targetDatasource.getDataset().hasMetaPart()) {
-            throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, 
sourceLoc,
-                    targetDatasource.getDataset().getDatasetName(), "insert 
into");
+            throw new CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, 
sourceLoc, "insert into",
+                    targetDatasource.getDataset().getDatasetName());
         }
 
         List<String> filterField = 
DatasetUtil.getFilterField(targetDatasource.getDataset());
diff --git 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 663876f5d2..8d2001042f 100644
--- 
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ 
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -2388,7 +2388,7 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
             IRequestParameters requestParameters) throws Exception {
         TruncateDatasetStatement truncateStmt = (TruncateDatasetStatement) 
stmt;
         SourceLocation sourceLoc = truncateStmt.getSourceLocation();
-        String datasetName = truncateStmt.getDatasetName().getValue();
+        String datasetName = truncateStmt.getDatasetName();
         
metadataProvider.validateDatabaseObjectName(truncateStmt.getNamespace(), 
datasetName, sourceLoc);
         Namespace stmtActiveNamespace = 
getActiveNamespace(truncateStmt.getNamespace());
         DataverseName dataverseName = stmtActiveNamespace.getDataverseName();
@@ -2461,8 +2461,18 @@ public class QueryTranslator extends 
AbstractLangTranslator implements IStatemen
                                     metadataProvider.isUsingDatabase()));
                 }
             }
+            if (ds.hasMetaPart()) {
+                throw new 
CompilationException(ErrorCode.ILLEGAL_DML_OPERATION, sourceLoc, "truncate",
+                        ds.getDatasetFullyQualifiedName());
+            }
+            DatasetType dsType = ds.getDatasetType();
+            if (dsType != DatasetType.INTERNAL) {
+                String dsTypeName = dsType.toString().toLowerCase();
+                throw new 
CompilationException(ErrorCode.CANNOT_TRUNCATE_DATASET_TYPE, sourceLoc,
+                        dsType == DatasetType.EXTERNAL ? dsTypeName + " 
collection" : dsTypeName,
+                        ds.getDatasetFullyQualifiedName());
+            }
             validateDatasetState(metadataProvider, ds, sourceLoc);
-
             DatasetUtil.truncate(metadataProvider, ds);
 
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/RetryingQueryTranslator.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/RetryingQueryTranslator.java
index af580b26e8..feff7494de 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/RetryingQueryTranslator.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/cloud_storage/RetryingQueryTranslator.java
@@ -31,7 +31,6 @@ import 
org.apache.asterix.compiler.provider.ILangCompilationProvider;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.LoadStatement;
 import org.apache.asterix.lang.common.statement.TruncateDatasetStatement;
-import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.utils.Creator;
 import org.apache.asterix.translator.IRequestParameters;
@@ -128,8 +127,8 @@ public class RetryingQueryTranslator extends 
QueryTranslator {
                         metadataProvider.getLocks().reset();
                         ex = e;
                         LoadStatement loadStmt = (LoadStatement) stmt;
-                        TruncateDatasetStatement truncateDatasetStatement = 
new TruncateDatasetStatement(
-                                loadStmt.getNamespace(), new 
Identifier(loadStmt.getDatasetName()), true);
+                        TruncateDatasetStatement truncateDatasetStatement =
+                                new 
TruncateDatasetStatement(loadStmt.getNamespace(), loadStmt.getDatasetName(), 
true);
                         super.handleDatasetTruncateStatement(metadataProvider, 
truncateDatasetStatement,
                                 requestParameters);
                         metadataProvider.getLocks().reset();
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.01.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.01.ddl.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.01.ddl.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.01.ddl.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.02.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.02.update.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.02.update.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.02.update.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.03.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.03.query.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.03.query.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.03.query.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.04.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.04.query.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.04.query.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.04.query.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.05.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.05.query.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.05.query.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.05.query.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.06.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.06.ddl.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.06.ddl.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.06.ddl.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.07.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.07.query.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.07.query.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.07.query.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.08.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.08.query.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.08.query.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.08.query.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.09.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.09.query.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.09.query.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.09.query.sqlpp
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.10.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.10.ddl.sqlpp
similarity index 100%
rename from 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset.10.ddl.sqlpp
rename to 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/truncate-dataset-1/truncate-dataset-1.10.ddl.sqlpp
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 87baa0d937..a8eec590d7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/sqlpp_queries.xml
@@ -5273,7 +5273,7 @@
     <test-case FilePath="dml">
       <compilation-unit name="upsert-dataset-with-meta">
         <output-dir compare="Text">upsert-dataset-with-meta</output-dir>
-        <expected-error>upsert into dataset is not supported on datasets with 
meta records</expected-error>
+        <expected-error>Cannot use upsert into with 'DatasetWithMeta'. upsert 
into is not supported on datasets with meta records</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="dml">
@@ -5299,13 +5299,13 @@
     <test-case FilePath="dml">
       <compilation-unit name="delete-dataset-with-meta">
         <output-dir compare="Text">delete-dataset-with-meta</output-dir>
-        <expected-error>delete from dataset is not supported on datasets with 
meta records</expected-error>
+        <expected-error>Cannot use delete from with 'DatasetWithMeta'. delete 
from is not supported on datasets with meta records</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="dml">
       <compilation-unit name="insert-dataset-with-meta">
         <output-dir compare="Text">insert-dataset-with-meta</output-dir>
-        <expected-error>insert into dataset is not supported on datasets with 
meta records</expected-error>
+        <expected-error>Cannot use insert into with 'DatasetWithMeta'. insert 
into is not supported on datasets with meta records</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="dml">
@@ -14154,7 +14154,7 @@
     <test-case FilePath="load">
       <compilation-unit name="dataset-with-meta">
         <output-dir compare="Text">dataset-with-meta</output-dir>
-        <expected-error>ASX1184: Compilation error: DatasetWithMeta: load 
dataset is not supported on datasets with meta records (in line 27, at column 
1)</expected-error>
+        <expected-error>Cannot use load with 'DatasetWithMeta'. load is not 
supported on datasets with meta records (in line 27, at column 
1)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="load">
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
index d06a9e5d0d..b003b92886 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
@@ -320,6 +320,7 @@ public enum ErrorCode implements IError {
     FAILED_EXTERNAL_CROSS_ACCOUNT_AUTHENTICATION(1213),
     LONG_LIVED_CREDENTIALS_NEEDED_TO_ASSUME_ROLE(1214),
     TEMPORARY_CREDENTIALS_CANNOT_BE_USED_TO_ASSUME_ROLE(1215),
+    CANNOT_TRUNCATE_DATASET_TYPE(1216),
 
     // Feed errors
     DATAFLOW_ILLEGAL_STATE(3001),
diff --git 
a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties 
b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
index c1ffd13627..baa4213c36 100644
--- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
+++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
@@ -290,7 +290,7 @@
 1181 = Unsupported computed field type: '%1$s'
 1182 = Failed to calculate computed fields: %1$s
 1183 = In the file '%1$s' the expected type for the '%2$s' field is '%3$s' but 
the value '%4$s' was found instead.
-1184 = Compilation error: %1$s: %2$s dataset is not supported on datasets with 
meta records
+1184 = Cannot use %1$s with '%2$s'. %1$s is not supported on datasets with 
meta records
 1185 = Cannot find database with name %1$s
 1186 = A database with this name %1$s already exists
 1187 = Cannot drop database: %1$s %2$s being used by %3$s %4$s
@@ -322,6 +322,7 @@
 1213 = Failed to perform cross-account authentication. Encountered error : 
'%1$s'
 1214 = Long-lived credentials are required to assume a role
 1215 = Temporary credentials cannot be used to assume a role
+1216 = Cannot truncate %1$s '%2$s'
 
 # Feed Errors
 3001 = Illegal state.
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TruncateDatasetStatement.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TruncateDatasetStatement.java
index 7367f1d161..8e19d94ea5 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TruncateDatasetStatement.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/TruncateDatasetStatement.java
@@ -23,15 +23,14 @@ import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.base.AbstractStatement;
 import org.apache.asterix.lang.common.base.Statement;
-import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
 public class TruncateDatasetStatement extends AbstractStatement {
-    private final Namespace namespace;
-    private final Identifier datasetName;
+    private Namespace namespace;
+    private String datasetName;
     private final boolean ifExists;
 
-    public TruncateDatasetStatement(Namespace namespace, Identifier 
datasetName, boolean ifExists) {
+    public TruncateDatasetStatement(Namespace namespace, String datasetName, 
boolean ifExists) {
         this.namespace = namespace;
         this.datasetName = datasetName;
         this.ifExists = ifExists;
@@ -46,11 +45,15 @@ public class TruncateDatasetStatement extends 
AbstractStatement {
         return namespace;
     }
 
+    public String getDatabaseName() {
+        return namespace == null ? null : namespace.getDatabaseName();
+    }
+
     public DataverseName getDataverseName() {
         return namespace == null ? null : namespace.getDataverseName();
     }
 
-    public Identifier getDatasetName() {
+    public String getDatasetName() {
         return datasetName;
     }
 
@@ -58,6 +61,14 @@ public class TruncateDatasetStatement extends 
AbstractStatement {
         return ifExists;
     }
 
+    public void setNamespace(Namespace namespace) {
+        this.namespace = namespace;
+    }
+
+    public void setDatasetName(String datasetName) {
+        this.datasetName = datasetName;
+    }
+
     @Override
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws 
CompilationException {
         return visitor.visit(this, arg);
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppStatementRewriter.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppStatementRewriter.java
index 30b20bbcd5..e7c38e2a45 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppStatementRewriter.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppStatementRewriter.java
@@ -36,6 +36,7 @@ class SqlppStatementRewriter implements IStatementRewriter {
             case UPSERT:
             case DELETE:
             case COPY_TO:
+            case TRUNCATE:
                 return true;
             default:
                 return false;
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSynonymRewriteVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSynonymRewriteVisitor.java
index 7c1c112169..d6f10b3e7b 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSynonymRewriteVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppSynonymRewriteVisitor.java
@@ -26,6 +26,7 @@ import org.apache.asterix.common.metadata.Namespace;
 import org.apache.asterix.lang.common.statement.DeleteStatement;
 import org.apache.asterix.lang.common.statement.InsertStatement;
 import org.apache.asterix.lang.common.statement.LoadStatement;
+import org.apache.asterix.lang.common.statement.TruncateDatasetStatement;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppAstVisitor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -33,7 +34,7 @@ import org.apache.hyracks.algebricks.common.utils.Quadruple;
 import org.apache.hyracks.api.exceptions.SourceLocation;
 
 /**
- * This class resolves dataset synonyms in load/insert/upsert/delete statements
+ * This class resolves dataset synonyms in load/insert/upsert/delete/truncate 
statements
  */
 public class SqlppSynonymRewriteVisitor extends AbstractSqlppAstVisitor<Void, 
MetadataProvider> {
 
@@ -78,6 +79,18 @@ public class SqlppSynonymRewriteVisitor extends 
AbstractSqlppAstVisitor<Void, Me
         return null;
     }
 
+    @Override
+    public Void visit(TruncateDatasetStatement truncateStmt, MetadataProvider 
mp) throws CompilationException {
+        Quadruple<DataverseName, String, Boolean, String> dsName =
+                resolveDatasetNameUsingSynonyms(mp, 
truncateStmt.getDatabaseName(), truncateStmt.getDataverseName(),
+                        truncateStmt.getDatasetName(), false, 
truncateStmt.getSourceLocation());
+        if (dsName != null) {
+            truncateStmt.setNamespace(new Namespace(dsName.getFourth(), 
dsName.getFirst()));
+            truncateStmt.setDatasetName(dsName.getSecond());
+        }
+        return null;
+    }
+
     private Quadruple<DataverseName, String, Boolean, String> 
resolveDatasetNameUsingSynonyms(
             MetadataProvider metadataProvider, String databaseName, 
DataverseName dataverseName, String datasetName,
             boolean includingViews, SourceLocation sourceLoc) throws 
CompilationException {
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj 
b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index 31641a7f4d..0d0b694c2a 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -2388,7 +2388,7 @@ TruncateDatasetStatement TruncateDatasetStatement(Token 
startStmtToken) throws P
   TruncateDatasetStatement stmt = null;
 }
 {
-  Dataset() stmt = TruncateDatasetSpecification(startStmtToken)
+  DatasetToken() stmt = TruncateDatasetSpecification(startStmtToken)
   {
     return stmt;
   }
@@ -2402,7 +2402,7 @@ TruncateDatasetStatement 
TruncateDatasetSpecification(Token startStmtToken) thro
 {
   pairId = QualifiedName() ifExists = IfExists()
   {
-    TruncateDatasetStatement stmt = new TruncateDatasetStatement(pairId.first, 
pairId.second, ifExists);
+    TruncateDatasetStatement stmt = new TruncateDatasetStatement(pairId.first, 
pairId.second.getValue(), ifExists);
     return addSourceLocation(stmt, startStmtToken);
   }
 }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
index 8bcf7a2f69..2551b865c9 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
@@ -768,7 +768,9 @@ public class DatasetUtil {
             hcc = metadataProvider.getApplicationContext().getHcc();
             JobUtils.runJobIfActive(hcc, job, true);
         } else {
-            throw new IllegalArgumentException("Cannot truncate a non-internal 
dataset.");
+            // check should have been done by caller
+            throw new IllegalArgumentException(
+                    "Cannot truncate a non-internal dataset " + 
ds.getDatasetFullyQualifiedName());
         }
     }
 

Reply via email to