[NO ISSUE][COMP] Disable creating index on meta

- user model changes: no
- storage format changes: no
- interface changes: no

Details:
Disable creating an index on meta fields.

Change-Id: Ib7d3b3706f200da0ef023e642b2d807511cb0801
Reviewed-on: https://asterix-gerrit.ics.uci.edu/3103
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
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 f619ab6..ed4c361 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
@@ -787,6 +787,7 @@
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         String datasetFullyQualifiedName = dataverseName + "." + datasetName;
+        boolean isSecondaryPrimary = stmtCreateIndex.getFieldExprs().isEmpty();
         Dataset ds = null;
         Index index = null;
         MetadataLockUtil.createIndexBegin(lockManager, metadataProvider.getLocks(), dataverseName,
@@ -808,10 +809,19 @@
                     throw new CompilationException(ErrorCode.INDEX_EXISTS, sourceLoc, indexName);
                 }
             }
-            // can't create secondary primary index on an external dataset
-            if (ds.getDatasetType() == DatasetType.EXTERNAL && stmtCreateIndex.getFieldExprs().isEmpty()) {
+            // find keySourceIndicators for secondary primary index since the parser isn't aware of them
+            if (isSecondaryPrimary && ds.getDatasetType() == DatasetType.INTERNAL) {
+                keySourceIndicators = ((InternalDatasetDetails) ds.getDatasetDetails()).getKeySourceIndicator();
+            }
+            // disable creating secondary primary index on an external dataset
+            if (isSecondaryPrimary && ds.getDatasetType() == DatasetType.EXTERNAL) {
                 throw new AsterixException(ErrorCode.CANNOT_CREATE_SEC_PRIMARY_IDX_ON_EXT_DATASET);
             }
+            // disable creating an index on meta fields (fields with source indicator == 1 are meta fields)
+            if (keySourceIndicators.stream().anyMatch(fieldSource -> fieldSource == 1) && !isSecondaryPrimary) {
+                throw new AsterixException(ErrorCode.COMPILATION_ERROR, sourceLoc,
+                        "Cannot create index on meta fields");
+            }
             Datatype dt = MetadataManager.INSTANCE.getDatatype(metadataProvider.getMetadataTxnContext(),
                     ds.getItemTypeDataverseName(), ds.getItemTypeName());
             ARecordType aRecordType = (ARecordType) dt.getDatatype();
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 37eaf79..3ab1ff9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -8870,6 +8870,7 @@
     <test-case FilePath="feeds">
       <compilation-unit name="change-feed-with-meta-with-mixed-index">
         <output-dir compare="Text">change-feed-with-meta-with-mixed-index</output-dir>
+        <expected-error>Compilation error: Cannot create index on meta fields (in line 61, at column 1)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="feeds">
@@ -8885,7 +8886,7 @@
     <test-case FilePath="feeds">
       <compilation-unit name="change-feed-with-meta-open-index-in-meta">
         <output-dir compare="Text">change-feed-with-meta-open-index-in-meta</output-dir>
-        <expected-error>Typed open index can only be created on the record part</expected-error>
+        <expected-error>Compilation error: Cannot create index on meta fields (in line 60, at column 1)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="feeds">
@@ -8896,11 +8897,13 @@
     <test-case FilePath="feeds">
       <compilation-unit name="change-feed-with-meta-pk-in-meta-index-after-ingest">
         <output-dir compare="Text">change-feed-with-meta-pk-in-meta-index-after-ingest</output-dir>
+        <expected-error>Compilation error: Cannot create index on meta fields (in line 27, at column 1)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="feeds">
       <compilation-unit name="change-feed-with-meta-pk-in-meta-index-in-meta">
         <output-dir compare="Text">change-feed-with-meta-pk-in-meta-index-in-meta</output-dir>
+        <expected-error>Compilation error: Cannot create index on meta fields (in line 60, at column 1)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="feeds">