From 4986de84ad0a7b70e8cd4788564d13ad6f03e016 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Fri, 7 Sep 2012 15:32:43 +0400 Subject: Cassandra SE: added support for boolean type. --- mysql-test/r/cassandra.result | 10 ++++++++++ mysql-test/t/cassandra.test | 15 +++++++++++++++ storage/cassandra/ha_cassandra.cc | 31 +++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/mysql-test/r/cassandra.result b/mysql-test/r/cassandra.result index 36d562f3348..401bc75cc80 100644 --- a/mysql-test/r/cassandra.result +++ b/mysql-test/r/cassandra.result @@ -266,3 +266,13 @@ rowkey col1 9b5658dc-f32f-11e1-94cd-f46d046e9f09 1234 delete from t2; drop table t2; +CREATE TABLE t2 (rowkey int PRIMARY KEY, boolcol varchar(12)) ENGINE=CASSANDRA +thrift_host='localhost' keyspace='mariadbtest2' column_family = 'cf7'; +insert into t2 values (0, 0); +insert into t2 values (1, 1); +select * from t2; +rowkey boolcol +0 0 +1 1 +delete from t2; +drop table t2; diff --git a/mysql-test/t/cassandra.test b/mysql-test/t/cassandra.test index b7762085029..6738cee4c77 100644 --- a/mysql-test/t/cassandra.test +++ b/mysql-test/t/cassandra.test @@ -53,6 +53,8 @@ create columnfamily cf5 (rowkey bigint primary key, uuidcol uuid); create columnfamily cf6 (rowkey uuid primary key, col1 int); +create columnfamily cf7 (rowkey int primary key, boolcol boolean); + ./cassandra-cli CREATE COLUMN FAMILY cf10 @@ -329,6 +331,16 @@ select * from t2; delete from t2; drop table t2; + +# create columnfamily cf7 (rowkey int primary key, boolcol boolean); +CREATE TABLE t2 (rowkey int PRIMARY KEY, boolcol varchar(12)) ENGINE=CASSANDRA + thrift_host='localhost' keyspace='mariadbtest2' column_family = 'cf7'; +insert into t2 values (0, 0); +insert into t2 values (1, 1); +select * from t2; +delete from t2; +drop table t2; + ############################################################################ ## Cassandra cleanup ############################################################################ @@ -337,6 +349,9 @@ drop columnfamily cf1; drop columnfamily cf2; drop columnfamily cf3; drop columnfamily cf4; +drop columnfamily cf5; +drop columnfamily cf6; +drop columnfamily cf7; --enable_parsing ############################################################################ ## Cassandra cleanup ends diff --git a/storage/cassandra/ha_cassandra.cc b/storage/cassandra/ha_cassandra.cc index f5ca8a4494d..7ef563114fd 100644 --- a/storage/cassandra/ha_cassandra.cc +++ b/storage/cassandra/ha_cassandra.cc @@ -529,6 +529,28 @@ static void flip32(const char *from, char* to) to[3]= from[0]; } + +class TinyintDataConverter : public ColumnDataConverter +{ + char buf; +public: + void cassandra_to_mariadb(const char *cass_data, int cass_data_len) + { + DBUG_ASSERT(cass_data_len == 1); + field->store(cass_data[0]); + } + + bool mariadb_to_cassandra(char **cass_data, int *cass_data_len) + { + buf= field->val_int()? 1 : 0; /* TODO: error handling? */ + *cass_data= (char*)&buf; + *cass_data_len= 1; + return false; + } + ~TinyintDataConverter(){} +}; + + class Int32DataConverter : public ColumnDataConverter { int32_t buf; @@ -683,6 +705,7 @@ public: ~UuidDataConverter(){} }; + const char * const validator_bigint= "org.apache.cassandra.db.marshal.LongType"; const char * const validator_int= "org.apache.cassandra.db.marshal.Int32Type"; const char * const validator_counter= "org.apache.cassandra.db.marshal.CounterColumnType"; @@ -698,12 +721,20 @@ const char * const validator_timestamp="org.apache.cassandra.db.marshal.DateType const char * const validator_uuid= "org.apache.cassandra.db.marshal.UUIDType"; +const char * const validator_boolean= "org.apache.cassandra.db.marshal.BooleanType"; + ColumnDataConverter *map_field_to_validator(Field *field, const char *validator_name) { ColumnDataConverter *res= NULL; switch(field->type()) { case MYSQL_TYPE_TINY: + if (!strcmp(validator_name, validator_boolean)) + { + res= new TinyintDataConverter; + break; + } + /* fall through: */ case MYSQL_TYPE_SHORT: case MYSQL_TYPE_LONGLONG: if (!strcmp(validator_name, validator_bigint)) -- cgit v1.2.1