[ 
https://issues.apache.org/jira/browse/CASSANDRA-18465?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jacek Lewandowski updated CASSANDRA-18465:
------------------------------------------
    Description: 
I'd like to propose adding support for multiple branches and result sets for 
Accord transactions. It could look like this:

{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  LET c = ...
  IF condition THEN
    SELECT 1, a.value
    UPDATE ...
  ELSE IF condition2 THEN
    SELECT 2, b.value
    UPDATE ...
  ELSE
    SELECT 3, c.value
  END IF
COMMIT TRANSACTION
{code}

The existing syntax would remain valid, when a single {{SELECT}} is defined in 
which case the conditional SELECTs would not be valid. 

{{SELECT}}s would be validated to return columns of the same type. They would 
be able to return literals as well.

This would be make the result of the transaction more intuitive as the client 
would know explicitly if the updates where applied or not.

The following syntax would be considered as invalid:

1. {{SELECT}}s defined both on the top level and in branches
{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  SELECT ...  <--------------------------------
  IF condition THEN
    SELECT 'one', a.value  <--------------------------------
    UPDATE ...
  ELSE IF condition2 THEN
    SELECT 'two', b.value  <--------------------------------
    UPDATE ...
  ELSE
    SELECT 'three', NULL  <--------------------------------
  END IF
COMMIT TRANSACTION
{code}

2. {{SELECT}} defined after update - select must be before the update to make 
it clear that the data is read before modification

{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  IF condition THEN
    UPDATE ...
    SELECT 'one', a.value  <--------------------------------
  ELSE IF condition2 THEN
    UPDATE ...
    SELECT 'two', b.value
  ELSE
    SELECT 'three', NULL
  END IF
COMMIT TRANSACTION
{code}

3. Missing {{SELECT}} in a conditional branch - if {{SELECT}} is defined in a 
any conditional branch, it has to be defined in all branches:

{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  IF condition THEN
    SELECT 'one', a.value
    UPDATE ...
  ELSE IF condition2 THEN
    SELECT 'two', b.value
    UPDATE ...
  ELSE  <--------------------------------
    UPDATE ... 
  END IF
COMMIT TRANSACTION
{code}

{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  IF condition THEN
    SELECT 'one', a.value
    UPDATE ...
  END IF <-------------------------------- (else branch is implicit and it has 
no SELECT)
COMMIT TRANSACTION
{code}

Selections in conditional branches will support only returning references - no 
support for full query is planned in this ticket.


  was:
I'd like to propose adding support for multiple branches and result sets for 
Accord transactions. It could look like this:

{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  IF condition THEN
    SELECT 'one', a.value
    UPDATE ...
  ELSE IF condition2 THEN
    SELECT 'two', b.value
    UPDATE ...
  ELSE
    SELECT 'three', NULL
  END IF
COMMIT TRANSACTION
{code}

The existing syntax would remain valid, when a single SELECT is defined in 
which case the conditional SELECTs would not be valid. 

SELECTs would be validated to return columns of the same type. They would be 
able to return literals as well.

This would be make the result of the transaction more intuitive as the client 
would know explicitly if the updates where applied or not.

The following syntax would be considered as invalid:

1. select defined both on the top level and in branches
{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  SELECT ...
  IF condition THEN
    SELECT 'one', a.value
    UPDATE ...
  ELSE IF condition2 THEN
    SELECT 'two', b.value
    UPDATE ...
  ELSE
    SELECT 'three', NULL
  END IF
COMMIT TRANSACTION
{code}

2. select defined after update - select must be before the update to make it 
clear we select data before modification

{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  IF condition THEN
    UPDATE ...
    SELECT 'one', a.value
  ELSE IF condition2 THEN
    UPDATE ...
    SELECT 'two', b.value
  ELSE
    SELECT 'three', NULL
  END IF
COMMIT TRANSACTION
{code}

3. missing select - if select is defined in a single branch, it has to be 
defined in all branches:

{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  IF condition THEN
    SELECT 'one', a.value
    UPDATE ...
  ELSE IF condition2 THEN
    SELECT 'two', b.value
    UPDATE ...
  ELSE
    UPDATE ... 
  END IF
COMMIT TRANSACTION
{code}

{code:sql}
BEGIN TRANSACTION
  LET a = ...
  LET b = ...
  IF condition THEN
    SELECT 'one', a.value
    UPDATE ...
  END IF
COMMIT TRANSACTION
{code}




> Add support for multiple condition branches and results in Accord transaction
> -----------------------------------------------------------------------------
>
>                 Key: CASSANDRA-18465
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-18465
>             Project: Cassandra
>          Issue Type: New Feature
>          Components: Accord, CQL/Syntax
>            Reporter: Jacek Lewandowski
>            Assignee: Jacek Lewandowski
>            Priority: Normal
>
> I'd like to propose adding support for multiple branches and result sets for 
> Accord transactions. It could look like this:
> {code:sql}
> BEGIN TRANSACTION
>   LET a = ...
>   LET b = ...
>   LET c = ...
>   IF condition THEN
>     SELECT 1, a.value
>     UPDATE ...
>   ELSE IF condition2 THEN
>     SELECT 2, b.value
>     UPDATE ...
>   ELSE
>     SELECT 3, c.value
>   END IF
> COMMIT TRANSACTION
> {code}
> The existing syntax would remain valid, when a single {{SELECT}} is defined 
> in which case the conditional SELECTs would not be valid. 
> {{SELECT}}s would be validated to return columns of the same type. They would 
> be able to return literals as well.
> This would be make the result of the transaction more intuitive as the client 
> would know explicitly if the updates where applied or not.
> The following syntax would be considered as invalid:
> 1. {{SELECT}}s defined both on the top level and in branches
> {code:sql}
> BEGIN TRANSACTION
>   LET a = ...
>   LET b = ...
>   SELECT ...  <--------------------------------
>   IF condition THEN
>     SELECT 'one', a.value  <--------------------------------
>     UPDATE ...
>   ELSE IF condition2 THEN
>     SELECT 'two', b.value  <--------------------------------
>     UPDATE ...
>   ELSE
>     SELECT 'three', NULL  <--------------------------------
>   END IF
> COMMIT TRANSACTION
> {code}
> 2. {{SELECT}} defined after update - select must be before the update to make 
> it clear that the data is read before modification
> {code:sql}
> BEGIN TRANSACTION
>   LET a = ...
>   LET b = ...
>   IF condition THEN
>     UPDATE ...
>     SELECT 'one', a.value  <--------------------------------
>   ELSE IF condition2 THEN
>     UPDATE ...
>     SELECT 'two', b.value
>   ELSE
>     SELECT 'three', NULL
>   END IF
> COMMIT TRANSACTION
> {code}
> 3. Missing {{SELECT}} in a conditional branch - if {{SELECT}} is defined in a 
> any conditional branch, it has to be defined in all branches:
> {code:sql}
> BEGIN TRANSACTION
>   LET a = ...
>   LET b = ...
>   IF condition THEN
>     SELECT 'one', a.value
>     UPDATE ...
>   ELSE IF condition2 THEN
>     SELECT 'two', b.value
>     UPDATE ...
>   ELSE  <--------------------------------
>     UPDATE ... 
>   END IF
> COMMIT TRANSACTION
> {code}
> {code:sql}
> BEGIN TRANSACTION
>   LET a = ...
>   LET b = ...
>   IF condition THEN
>     SELECT 'one', a.value
>     UPDATE ...
>   END IF <-------------------------------- (else branch is implicit and it 
> has no SELECT)
> COMMIT TRANSACTION
> {code}
> Selections in conditional branches will support only returning references - 
> no support for full query is planned in this ticket.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to