You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pr@cassandra.apache.org by "jacek-lewandowski (via GitHub)" <gi...@apache.org> on 2023/06/23 07:11:04 UTC

[GitHub] [cassandra] jacek-lewandowski commented on a diff in pull request #2427: Extend grammar to accept the improved syntax.

jacek-lewandowski commented on code in PR #2427:
URL: https://github.com/apache/cassandra/pull/2427#discussion_r1239418223


##########
test/unit/org/apache/cassandra/cql3/statements/TransactionStatementTest.java:
##########
@@ -359,12 +374,218 @@ public void shouldRejectLetSelectWithIncompletePartitionKey()
                   .hasMessageContaining(String.format(ILLEGAL_RANGE_QUERY_MESSAGE, "LET assignment row1", "at [2:15]"));
     }
 
+    @Test
+    public void shouldRejectSelectDefinedOnTopLevelAndInBranches()
+    {
+        String query = "BEGIN TRANSACTION\n" +
+                       "  LET a = (SELECT * FROM ks.tbl1 WHERE k = 0 AND c = 0);\n" +
+                       "  LET b = (SELECT * FROM ks.tbl1 WHERE k = 1 AND c = 0);\n" +
+                       "  SELECT a.v;\n" +
+                       "  IF a.v = 1 THEN\n" +
+                       "    SELECT b.v;\n" +
+                       "    UPDATE ks.tbl1 SET v = a.v WHERE k=1 AND c=2;\n" +
+                       "  ELSE IF a.v = 2 THEN\n" +
+                       "    SELECT a.v;\n" +
+                       "    UPDATE ks.tbl1 SET v = b.v WHERE k=1 AND c=2;\n" +
+                       "  ELSE\n" +
+                       "    SELECT b.v;\n" +
+                       "  END IF\n" +
+                       "COMMIT TRANSACTION";
+
+        Assertions.assertThatThrownBy(() -> prepare(query))
+                    .isInstanceOf(InvalidRequestException.class)
+                    .hasMessageContaining(String.format(SELECT_ALREADY_DEFINED_MESSAGE, "at [5:3]"));
+    }
+
+    @Test
+    public void shouldRejectSelectDefinedAfterUpdate()
+    {
+        String query = "BEGIN TRANSACTION\n" +
+                       "  LET a = (SELECT * FROM ks.tbl1 WHERE k = 0 AND c = 0);\n" +
+                       "  LET b = (SELECT * FROM ks.tbl1 WHERE k = 1 AND c = 0);\n" +
+                       "  IF a.v = 1 THEN\n" +
+                       "    UPDATE ks.tbl1 SET v = a.v WHERE k=1 AND c=2;\n" +
+                       "    SELECT b.value, a.value;\n" +   // <-- SELECT defined after UPDATE
+                       "  ELSE IF a.v = 2 THEN\n" +
+                       "    SELECT a.value, b.value;\n" +
+                       "    UPDATE ks.tbl1 SET v = b.v WHERE k=1 AND c=2;\n" +
+                       "  ELSE\n" +
+                       "    SELECT a.value, b.value;\n" +
+                       "  END IF\n" +
+                       "COMMIT TRANSACTION";
+
+        Assertions.assertThatThrownBy(() -> prepare(query))
+                  .isInstanceOf(SyntaxException.class)
+                  .hasMessageContaining("mismatched input 'SELECT' expecting K_END");
+    }
+
+    @Test
+    public void shouldRejectMissingSelectInBranch()

Review Comment:
   hmm... you are right, there can be an empty result; this will simplify things a bit



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: pr-unsubscribe@cassandra.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: pr-unsubscribe@cassandra.apache.org
For additional commands, e-mail: pr-help@cassandra.apache.org