From 9cdf5eeec91b60fbdffdc7d7a675f47bdb39ff50 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Sat, 18 Aug 2012 21:29:31 +0400 Subject: [PATCH] MDEV-431: Cassandra storage engine - Support "DELETE FROM cassandra_table" --- mysql-test/r/cassandra.result | 3 +++ mysql-test/t/cassandra.test | 5 +++++ storage/cassandra/cassandra_se.cc | 22 ++++++++++++++++++++++ storage/cassandra/cassandra_se.h | 3 ++- storage/cassandra/ha_cassandra.cc | 19 ++++++++++++------- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/mysql-test/r/cassandra.result b/mysql-test/r/cassandra.result index 651adf40c7b..4e45685a8c2 100644 --- a/mysql-test/r/cassandra.result +++ b/mysql-test/r/cassandra.result @@ -22,4 +22,7 @@ select * from t1; rowkey data1 data2 data1-value 123456 data1-value2 34543 +delete from t1; +select * from t1; +rowkey data1 data2 drop table t1; diff --git a/mysql-test/t/cassandra.test b/mysql-test/t/cassandra.test index e316e23d626..80271e48d3e 100644 --- a/mysql-test/t/cassandra.test +++ b/mysql-test/t/cassandra.test @@ -55,6 +55,11 @@ create table t1 (rowkey char(36) primary key, data1 varchar(60), data2 bigint) e insert into t1 values ('rowkey10', 'data1-value', 123456); insert into t1 values ('rowkey11', 'data1-value2', 34543); select * from t1; + +# Check if deletion works +delete from t1; +select * from t1; + drop table t1; ############################################################################ diff --git a/storage/cassandra/cassandra_se.cc b/storage/cassandra/cassandra_se.cc index f8891a43351..c47787d97f4 100644 --- a/storage/cassandra/cassandra_se.cc +++ b/storage/cassandra/cassandra_se.cc @@ -95,6 +95,8 @@ public: /* Setup that's necessary before a multi-row read. (todo: use it before point lookups, too) */ void clear_read_columns(); void add_read_column(const char *name); + + bool truncate(); }; @@ -398,3 +400,23 @@ void Cassandra_se_impl::add_read_column(const char *name_arg) slice_pred.column_names.push_back(name); } + +bool Cassandra_se_impl::truncate() +{ + bool res= true; + try { + + cass->truncate(column_family); + res= false; + + } catch (InvalidRequestException ire) { + print_error("%s [%s]", ire.what(), ire.why.c_str()); + } catch (UnavailableException ue) { + print_error("UnavailableException: %s", ue.what()); + } catch (TimedOutException te) { + print_error("TimedOutException: %s", te.what()); + } + + return res; +} + diff --git a/storage/cassandra/cassandra_se.h b/storage/cassandra/cassandra_se.h index d35a6e6a003..44b6ac05ca8 100644 --- a/storage/cassandra/cassandra_se.h +++ b/storage/cassandra/cassandra_se.h @@ -44,7 +44,8 @@ public: /* read_set setup */ virtual void clear_read_columns()=0; virtual void add_read_column(const char *name)=0; - + + virtual bool truncate()=0; /* Passing error messages up to ha_cassandra */ char err_buffer[512]; const char *error_str() { return err_buffer; } diff --git a/storage/cassandra/ha_cassandra.cc b/storage/cassandra/ha_cassandra.cc index 02eddcaf5cd..21131944bb3 100644 --- a/storage/cassandra/ha_cassandra.cc +++ b/storage/cassandra/ha_cassandra.cc @@ -746,6 +746,18 @@ int ha_cassandra::rnd_next(uchar *buf) DBUG_RETURN(rc); } + +int ha_cassandra::delete_all_rows() +{ + bool bres; + DBUG_ENTER("ha_cassandra::delete_all_rows"); + + bres= se->truncate(); + + DBUG_RETURN(bres? HA_ERR_INTERNAL_ERROR: 0); +} + + ///////////////////////////////////////////////////////////////////////////// // Dummy implementations start ///////////////////////////////////////////////////////////////////////////// @@ -861,13 +873,6 @@ int ha_cassandra::delete_row(const uchar *buf) } -int ha_cassandra::delete_all_rows() -{ - DBUG_ENTER("ha_cassandra::delete_all_rows"); - DBUG_RETURN(HA_ERR_WRONG_COMMAND); -} - - /** check_if_incompatible_data() called if ALTER TABLE can't detect otherwise if new and old definition are compatible