This is an automated email from the ASF dual-hosted git repository.
dlych 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 d18c123 [NO ISSUE][API] Support sql-compat parameter in
QueryServiceServlet
d18c123 is described below
commit d18c1236abb1949cd8c3520b4b280885132a0b16
Author: Dmitry Lychagin <[email protected]>
AuthorDate: Mon Oct 11 12:18:55 2021 -0700
[NO ISSUE][API] Support sql-compat parameter in QueryServiceServlet
- user model changes: no
- storage format changes: no
- interface changes: yes
Details:
- QueryServiceServlet supports 'sql-compat' parameter which indicates
that a query should be evaluated in SQL-compatible mode
Change-Id: I3e0cfe3839e4bbdf1827cedf5f0abfaa536f78ff
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/13645
Integration-Tests: Jenkins <[email protected]>
Tested-by: Jenkins <[email protected]>
Reviewed-by: Dmitry Lychagin <[email protected]>
Reviewed-by: Ali Alsuliman <[email protected]>
---
.../asterix/translator/IRequestParameters.java | 2 ++
.../apache/asterix/api/common/APIFramework.java | 2 +-
.../api/http/server/NCQueryServiceServlet.java | 12 ++++++----
.../http/server/QueryServiceRequestParameters.java | 14 ++++++++++-
.../api/http/server/QueryServiceServlet.java | 1 +
.../message/ExecuteStatementRequestMessage.java | 28 ++++++++++++++++++----
.../asterix/app/translator/QueryTranslator.java | 8 +++++--
.../asterix/app/translator/RequestParameters.java | 10 ++++++++
.../lang/sqlpp/rewrites/SqlppQueryRewriter.java | 4 ++++
9 files changed, 67 insertions(+), 14 deletions(-)
diff --git
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
index ab1061f..c6022eb 100644
---
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
+++
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
@@ -78,6 +78,8 @@ public interface IRequestParameters extends
ICommonRequestParameters {
boolean isPrintSignature();
+ boolean isSQLCompatMode();
+
/**
* @return canonical name of the default dataverse for this statement
*/
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
index 53137e6..f2bb66d 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
@@ -150,7 +150,7 @@ public class APIFramework {
SqlppExpressionToPlanTranslator.REWRITE_IN_AS_OR_OPTION,
"hash_merge", "output-record-type",
DisjunctivePredicateToJoinRule.REWRITE_OR_AS_JOIN_OPTION,
SetAsterixPhysicalOperatorsRule.REWRITE_ATTEMPT_BATCH_ASSIGN,
- EquivalenceClassUtils.REWRITE_INTERNAL_QUERYUID_PK);
+ EquivalenceClassUtils.REWRITE_INTERNAL_QUERYUID_PK,
SqlppQueryRewriter.SQL_COMPAT_OPTION);
private final IRewriterFactory rewriterFactory;
private final IAstPrintVisitorFactory astPrintVisitorFactory;
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
index e6ba15f..5bcde3d 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
@@ -140,11 +140,13 @@ public class NCQueryServiceServlet extends
QueryServiceServlet {
Map<String, String> optionalParameters, Map<String, byte[]>
statementParameters, INCServiceContext ncCtx,
MessageFuture responseFuture, ILangExtension.Language
queryLanguage, String handleUrl,
int stmtCategoryRestrictionMask, boolean forceDropDataset) {
- return new ExecuteStatementRequestMessage(ncCtx.getNodeId(),
responseFuture.getFutureId(), queryLanguage,
- statementsText, sessionOutput.config(),
resultProperties.getNcToCcResultProperties(),
- param.getClientContextID(), param.getDataverse(), handleUrl,
optionalParameters, statementParameters,
- param.isMultiStatement(), param.getProfileType(),
stmtCategoryRestrictionMask, requestReference,
- forceDropDataset);
+ ExecuteStatementRequestMessage requestMessage = new
ExecuteStatementRequestMessage(ncCtx.getNodeId(),
+ responseFuture.getFutureId(), queryLanguage, statementsText,
sessionOutput.config(),
+ resultProperties.getNcToCcResultProperties(),
param.getClientContextID(), param.getDataverse(),
+ handleUrl, optionalParameters, statementParameters,
param.isMultiStatement(), param.getProfileType(),
+ stmtCategoryRestrictionMask, requestReference,
forceDropDataset);
+ requestMessage.setSQLCompatMode(param.isSQLCompatMode());
+ return requestMessage;
}
private void cancelQuery(INCMessageBroker messageBroker, String nodeId,
String uuid, String clientContextID,
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
index 084bca7..df068c0 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceRequestParameters.java
@@ -79,7 +79,8 @@ public class QueryServiceRequestParameters {
PROFILE("profile"),
SIGNATURE("signature"),
MULTI_STATEMENT("multi-statement"),
- MAX_WARNINGS("max-warnings");
+ MAX_WARNINGS("max-warnings"),
+ SQL_COMPAT("sql-compat");
private final String str;
@@ -142,6 +143,7 @@ public class QueryServiceRequestParameters {
private boolean isCSVWithHeader = false;
private boolean signature = true;
private boolean multiStatement = true;
+ private boolean sqlCompatMode = false;
private long timeout = TimeUnit.MILLISECONDS.toMillis(Long.MAX_VALUE);
private long maxResultReads = 1L;
private long maxWarnings = 0L;
@@ -358,6 +360,14 @@ public class QueryServiceRequestParameters {
this.multiStatement = multiStatement;
}
+ public boolean isSQLCompatMode() {
+ return sqlCompatMode;
+ }
+
+ public void setSQLCompatMode(boolean sqlCompatMode) {
+ this.sqlCompatMode = sqlCompatMode;
+ }
+
public void setMaxWarnings(long maxWarnings) {
this.maxWarnings = maxWarnings;
}
@@ -391,6 +401,7 @@ public class QueryServiceRequestParameters {
object.put("parseOnly", parseOnly);
object.put("readOnly", readOnly);
object.put("maxWarnings", maxWarnings);
+ object.put("sqlCompat", sqlCompatMode);
if (statementParams != null) {
for (Map.Entry<String, JsonNode> statementParam :
statementParams.entrySet()) {
object.set('$' + statementParam.getKey(),
statementParam.getValue());
@@ -474,6 +485,7 @@ public class QueryServiceRequestParameters {
setJob(parseBoolean(req, Parameter.JOB.str(), valGetter, isJob()));
setSignature(parseBoolean(req, Parameter.SIGNATURE.str(), valGetter,
isSignature()));
setClientType(parseIfExists(req, Parameter.CLIENT_TYPE.str(),
valGetter, getClientType(), clientTypes::get));
+ setSQLCompatMode(parseBoolean(req, Parameter.SQL_COMPAT.str(),
valGetter, isSQLCompatMode()));
}
protected void setExtraParams(JsonNode jsonRequest) throws
HyracksDataException {
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
index b46c299..9f83aa8 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
@@ -519,6 +519,7 @@ public class QueryServiceServlet extends
AbstractQueryApiServlet {
resultProperties, stats, statementProperties, null,
param.getClientContextID(), param.getDataverse(),
optionalParameters, stmtParams, param.isMultiStatement(),
stmtCategoryRestriction);
requestParameters.setPrintSignature(param.isSignature());
+ requestParameters.setSQLCompatMode(param.isSQLCompatMode());
return requestParameters;
}
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
index fa05870..0a5e033 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
@@ -66,7 +66,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ExecuteStatementRequestMessage implements ICcAddressedMessage {
- private static final long serialVersionUID = 3L;
+ private static final long serialVersionUID = 4L;
private static final Logger LOGGER = LogManager.getLogger();
//TODO: Make configurable:
https://issues.apache.org/jira/browse/ASTERIXDB-2062
public static final long DEFAULT_NC_TIMEOUT_MILLIS =
TimeUnit.MILLISECONDS.toMillis(Long.MAX_VALUE);
@@ -89,6 +89,7 @@ public class ExecuteStatementRequestMessage implements
ICcAddressedMessage {
private final IRequestReference requestReference;
private final boolean forceDropDataset;
private final boolean skipAdmissionPolicy;
+ private boolean sqlCompatMode;
public ExecuteStatementRequestMessage(String requestNodeId, long
requestMessageId, ILangExtension.Language lang,
String statementsText, SessionConfig sessionConfig,
ResultProperties resultProperties,
@@ -126,6 +127,14 @@ public class ExecuteStatementRequestMessage implements
ICcAddressedMessage {
this.defaultDataverseName = defaultDataverseName;
}
+ public boolean isSQLCompatMode() {
+ return sqlCompatMode;
+ }
+
+ public void setSQLCompatMode(boolean sqlCompatMode) {
+ this.sqlCompatMode = sqlCompatMode;
+ }
+
@Override
public void handle(ICcApplicationContext ccAppCtx) throws
HyracksDataException, InterruptedException {
ICCServiceContext ccSrvContext = ccAppCtx.getServiceContext();
@@ -166,10 +175,8 @@ public class ExecuteStatementRequestMessage implements
ICcAddressedMessage {
final IStatementExecutor.Stats stats = new
IStatementExecutor.Stats();
stats.setProfileType(profileType);
Map<String, IAObject> stmtParams =
RequestParameters.deserializeParameterValues(statementParameters);
- final IRequestParameters requestParameters = new
RequestParameters(requestReference, statementsText, null,
- resultProperties, stats, statementProperties, outMetadata,
clientContextID, defaultDataverseName,
- optionalParameters, stmtParams, multiStatement,
statementCategoryRestrictionMask, forceDropDataset,
- skipAdmissionPolicy);
+ final IRequestParameters requestParameters =
+ createRequestParameters(statementProperties, stmtParams,
outMetadata, stats);
translator.compileAndExecute(ccApp.getHcc(), requestParameters);
translator.getWarnings(warnings, maxWarnings - warnings.size());
stats.updateTotalWarningsCount(parserTotalWarningsCount);
@@ -194,6 +201,17 @@ public class ExecuteStatementRequestMessage implements
ICcAddressedMessage {
}
}
+ protected IRequestParameters
createRequestParameters(IStatementExecutor.StatementProperties
statementProperties,
+ Map<String, IAObject> stmtParams,
IStatementExecutor.ResultMetadata outMetadata,
+ IStatementExecutor.Stats stats) {
+ RequestParameters requestParameters = new
RequestParameters(requestReference, statementsText, null,
+ resultProperties, stats, statementProperties, outMetadata,
clientContextID, defaultDataverseName,
+ optionalParameters, stmtParams, multiStatement,
statementCategoryRestrictionMask, forceDropDataset,
+ skipAdmissionPolicy);
+ requestParameters.setSQLCompatMode(sqlCompatMode);
+ return requestParameters;
+ }
+
protected CCMessageBroker getMessageBroker(ICcApplicationContext ccAppCtx)
{
ICCServiceContext ccSrvContext = ccAppCtx.getServiceContext();
return (CCMessageBroker) ccSrvContext.getMessageBroker();
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 0529c15..70ac386 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
@@ -158,6 +158,7 @@ import org.apache.asterix.lang.common.struct.Identifier;
import org.apache.asterix.lang.common.struct.VarIdentifier;
import org.apache.asterix.lang.common.util.FunctionUtil;
import org.apache.asterix.lang.common.util.ViewUtil;
+import org.apache.asterix.lang.sqlpp.rewrites.SqlppQueryRewriter;
import org.apache.asterix.metadata.IDatasetDetails;
import org.apache.asterix.metadata.MetadataManager;
import org.apache.asterix.metadata.MetadataTransactionContext;
@@ -350,7 +351,7 @@ public class QueryTranslator extends AbstractLangTranslator
implements IStatemen
validateOperation(appCtx, activeDataverse, stmt);
MetadataProvider metadataProvider =
MetadataProvider.create(appCtx, activeDataverse);
configureMetadataProvider(metadataProvider, config,
resultSerializerFactoryProvider, writerFactory,
- outputFile);
+ outputFile, requestParameters, stmt);
IStatementRewriter stmtRewriter =
rewriterFactory.createStatementRewriter();
rewriteStatement(stmt, stmtRewriter, metadataProvider); //
Rewrite the statement's AST.
Statement.Kind kind = stmt.getKind();
@@ -519,7 +520,10 @@ public class QueryTranslator extends
AbstractLangTranslator implements IStatemen
protected void configureMetadataProvider(MetadataProvider
metadataProvider, Map<String, String> config,
IResultSerializerFactoryProvider resultSerializerFactoryProvider,
IAWriterFactory writerFactory,
- FileSplit outputFile) {
+ FileSplit outputFile, IRequestParameters requestParameters,
Statement statement) {
+ if (statement.getKind() == Statement.Kind.QUERY &&
requestParameters.isSQLCompatMode()) {
+
metadataProvider.getConfig().put(SqlppQueryRewriter.SQL_COMPAT_OPTION,
Boolean.TRUE.toString());
+ }
metadataProvider.getConfig().putAll(config);
metadataProvider.setWriterFactory(writerFactory);
metadataProvider.setResultSerializerFactoryProvider(resultSerializerFactoryProvider);
diff --git
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
index 7b634bd..8bc6b76 100644
---
a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
+++
b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
@@ -64,6 +64,7 @@ public class RequestParameters implements IRequestParameters {
private final boolean forceDropDataset;
private final boolean skipAdmissionPolicy;
private boolean printSignature;
+ private boolean sqlCompatMode;
public RequestParameters(IRequestReference requestReference, String
statement, IResultSet resultSet,
ResultProperties resultProperties, Stats stats,
StatementProperties statementProperties,
@@ -199,6 +200,15 @@ public class RequestParameters implements
IRequestParameters {
this.printSignature = printSignature;
}
+ @Override
+ public boolean isSQLCompatMode() {
+ return sqlCompatMode;
+ }
+
+ public void setSQLCompatMode(boolean sqlCompatMode) {
+ this.sqlCompatMode = sqlCompatMode;
+ }
+
public static Map<String, byte[]> serializeParameterValues(Map<String,
JsonNode> inParams,
SessionConfig.OutputFormat format) throws HyracksDataException {
if (inParams == null || inParams.isEmpty()) {
diff --git
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index 7b2e5e3..b6fd9da 100644
---
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@ -100,6 +100,10 @@ public class SqlppQueryRewriter implements IQueryRewriter {
public static final String INLINE_WITH_OPTION = "inline_with";
private static final boolean INLINE_WITH_OPTION_DEFAULT = true;
+
+ public static final String SQL_COMPAT_OPTION = "sql_compat";
+ private static final boolean SQL_COMPAT_OPTION_DEFAULT = false;
+
private final IParserFactory parserFactory;
private SqlppFunctionBodyRewriter functionAndViewBodyRewriter;
private IReturningStatement topStatement;