[
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: [email protected]
For additional commands, e-mail: [email protected]