cassandra-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Aleksandr Sorokoumov (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CASSANDRA-13917) COMPACT STORAGE inserts on tables without clusterings accept hidden column1 and value columns
Date Fri, 13 Oct 2017 16:15:00 GMT

    [ https://issues.apache.org/jira/browse/CASSANDRA-13917?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16203776#comment-16203776
] 

Aleksandr Sorokoumov commented on CASSANDRA-13917:
--------------------------------------------------

If the table is created with COMPACT STORAGE and a single primary key, e.g.

{noformat}
cqlsh:k> CREATE TABLE t1 (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE;
{noformat}

We get the behavior from the tests:

{noformat}
cqlsh:k> INSERT INTO t1 (a,b,c,column1) VALUES (1,1,1,'a');
cqlsh:k> select * from t1;

 a | b | c
---+---+---

(0 rows)
{noformat}

Corresponding CFMMetaData and the column definition kinds during the {{INSERT}}:
{noformat}
cfm:
isCompactTable() => true
isStaticCompactTable() => true

Column definitions:
a.kind=PARTITION_KEY
b.kind=STATIC
c.kind=STATIC
column1.kind=CLUSTERING
value.kind=REGULAR
{noformat}

Also, if the table contains a column with a name {{column1}}, the hidden column will be called
{{column2}}:

{noformat}
cqlsh:k> CREATE TABLE t2 (a int PRIMARY KEY, b int, c int, column1 text) WITH COMPACT STORAGE;
cqlsh:k> INSERT INTO t2 (a,b,c,column1, column2, value) VALUES (1,1,1,'a','a',0xbb);
cqlsh:k> select * from t2;

 a | b | c | column1
---+---+---+---------

(0 rows)
{noformat}

If the table is created with COMPACT STORAGE and a compound primary key, it works as expected:

{noformat}
cqlsh:k> CREATE TABLE t3 (a int, b int, c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE;
cqlsh:k> INSERT INTO t3 (a,b,c,column1) VALUES (1,1,1,'a');
InvalidRequest: Error from server: code=2200 [Invalid query] message="Undefined column name
column1"
cqlsh:k> INSERT INTO t3 (a,b,c,column1,value) VALUES (1,1,1,'a',0xff);
InvalidRequest: Error from server: code=2200 [Invalid query] message="Undefined column name
column1"
cqlsh:k> INSERT INTO t3 (a,b,c,value) VALUES (1,1,1,0xff);
InvalidRequest: Error from server: code=2200 [Invalid query] message="Undefined column name
value"
{noformat}

Corresponding CFMMetaData during the {{INSERT}}:

{noformat}
cfm.isCompactTable() => true
cfm.isStaticCompactTable() => false
{noformat}

h4. Solution

In {{UpdateStatement.prepareInternal}} when the CFM is {{StaticCompactTable}} check that the
columns to be updated are not {{CLUSTERING}} or {{REGULAR}}. if this is the case - "hide"
the columns by returning the error "Undefined column name".

Branches:

* [3.0.15|https://github.com/Gerrrr/cassandra/tree/13917-3.0.15]
* [3.11.1|https://github.com/Gerrrr/cassandra/tree/13917-3.11.1]

> COMPACT STORAGE inserts on tables without clusterings accept hidden column1 and value
columns
> ---------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-13917
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-13917
>             Project: Cassandra
>          Issue Type: Bug
>            Reporter: Alex Petrov
>            Assignee: Aleksandr Sorokoumov
>            Priority: Minor
>              Labels: lhf
>
> Test for the issue:
> {code}
>     @Test
>     public void testCompactStorage() throws Throwable
>     {
>         createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
>         assertInvalid("INSERT INTO %s (a, b, c, column1) VALUES (?, ?, ?, ?)", 1, 1,
1, ByteBufferUtil.bytes('a'));
>         // This one fails with Some clustering keys are missing: column1, which is still
wrong
>         assertInvalid("INSERT INTO %s (a, b, c, value) VALUES (?, ?, ?, ?)", 1, 1, 1,
ByteBufferUtil.bytes('a'));       
>         assertInvalid("INSERT INTO %s (a, b, c, column1, value) VALUES (?, ?, ?, ?, ?)",
1, 1, 1, ByteBufferUtil.bytes('a'), ByteBufferUtil.bytes('b'));
>         assertEmpty(execute("SELECT * FROM %s"));
>     }
> {code}
> Gladly, these writes are no-op, even though they succeed.
> {{value}} and {{column1}} should be completely hidden. Fixing this one should be as easy
as just adding validations.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

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


Mime
View raw message