Uploaded image for project: 'Cassandra'
  1. Cassandra
  2. CASSANDRA-14564

Adding regular column to COMPACT tables without clustering columns should trigger an InvalidRequestException

    XMLWordPrintableJSON

Details

    Description

      I have upgraded my system from cassandra 2.1.16 to 3.11.2. We had some tables with COMPACT STORAGE enabled. We see some weird   behaviour of cassandra while adding a column into it.

      Cassandra does not give any error while altering  however the added column is invisible. 

      Same behaviour when we create a new table with compact storage and try to alter it. Below is the commands ran in sequence: 

       

      x@cqlsh:xuser> CREATE TABLE xuser.employee(emp_id int PRIMARY KEY,emp_name text, emp_city text, emp_sal varint, emp_phone varint ) WITH  COMPACT STORAGE;
      x@cqlsh:xuser> desc table xuser.employee ;
      
      CREATE TABLE xuser.employee (
      emp_id int PRIMARY KEY,
      emp_city text,
      emp_name text,
      emp_phone varint,
      emp_sal varint
      ) WITH COMPACT STORAGE
      AND bloom_filter_fp_chance = 0.01
      AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
      AND comment = ''
      AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
      AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
      AND crc_check_chance = 1.0
      AND dclocal_read_repair_chance = 0.1
      AND default_time_to_live = 0
      AND gc_grace_seconds = 864000
      AND max_index_interval = 2048
      AND memtable_flush_period_in_ms = 0
      AND min_index_interval = 128
      AND read_repair_chance = 0.0
      AND speculative_retry = '99PERCENTILE';

      Now altering the table by adding a new column:
       

      x@cqlsh:xuser>  alter table employee add profile text;
      x@cqlsh:xuser> desc table xuser.employee ;
      
      CREATE TABLE xuser.employee (
          emp_id int PRIMARY KEY,
          emp_city text,
          emp_name text,
          emp_phone varint,
          emp_sal varint
      ) WITH COMPACT STORAGE
          AND bloom_filter_fp_chance = 0.01
          AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
          AND comment = ''
          AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
          AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
          AND crc_check_chance = 1.0
          AND dclocal_read_repair_chance = 0.1
          AND default_time_to_live = 0
          AND gc_grace_seconds = 864000
          AND max_index_interval = 2048
          AND memtable_flush_period_in_ms = 0
          AND min_index_interval = 128
          AND read_repair_chance = 0.0
          AND speculative_retry = '99PERCENTILE';
      

      notice that above desc table result does not have newly added column profile. However when i try to add it again it gives column already exist;

      x@cqlsh:xuser>  alter table employee add profile text;
      InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid column name profile because it conflicts with an existing column"
      x@cqlsh:xuser> select emp_name,profile from employee;
      
       emp_name | profile
      ----------+---------
      
      (0 rows)
      x@cqlsh:xuser>
      

      Inserting also behaves strange:

      x@cqlsh:xuser> INSERT INTO employee (emp_id , emp_city , emp_name , emp_phone , emp_sal ,profile) VALUES ( 1, 'ggn', 'john', 123456, 50000, 'SE');
      InvalidRequest: Error from server: code=2200 [Invalid query] message="Some clustering keys are missing: column1"
      x@cqlsh:xuser> INSERT INTO employee (emp_id , emp_city , emp_name , emp_phone , emp_sal ,profile,column1) VALUES ( 1, 'ggn', 'john', 123456, 50000, 'SE',null);
      x@cqlsh:xuser> select * from employee;
      
       emp_id | emp_city | emp_name | emp_phone | emp_sal
      --------+----------+----------+-----------+---------
      
      (0 rows)
      

      How to solve that ticket (blerer)--------------------------------------------------------------------------------------
      Adding regular columns to non-dense compact tables should be forbidden as it is the case for other column types. To do that AlterTableStatement should be modified to fire an InvalidRequestException when a user attempts to add a regular column to a a COMPACT TABLE without clustering columns.
      The fix should include a unit tests for that scenario

      Attachments

        Issue Links

          Activity

            People

              stefan.miklosovic Stefan Miklosovic
              laxmikant99 Laxmikant Upadhyay
              Stefan Miklosovic
              Benjamin Lerer
              Stefan Miklosovic Stefan Miklosovic
              Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 10m
                  10m