[ASTERIXDB-2050][SQL] Enforce a Semicolon After Each SQL++ Statement

- user model changes: a semicolon must be added after
  every SQL++ statement.
- storage format changes: no
- interface changes: no

Details:
- Enforce a semicolon after each SQL++ statement.
- Adapt existing SQL++ test cases to new model.

Change-Id: I27e9e8fde5ff867ab569c8d443ba1522738046e3
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1954
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index 4c1d174..b76adb8 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -350,12 +350,14 @@
   Statement stmt = null;
 }
 {
-  ( stmt = SingleStatement() (<SEMICOLON>)*
-    {
-      decls.add(stmt);
-    }
+  (
+    (stmt = SingleStatement()
+      {
+        decls.add(stmt);
+      }
+    )?
+    (<SEMICOLON>)+
   )*
-  (<SEMICOLON>)*
   <EOF>
   {
     return decls;
@@ -382,7 +384,7 @@
     | stmt = ConnectionStatement()
     | stmt = CompactStatement()
     | stmt = ExplainStatement()
-    | stmt = Query(false) <SEMICOLON>
+    | stmt = Query(false)
     | stmt = RefreshExternalDatasetStatement()
     | stmt = RunStatement()
   )