diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2012-09-07 15:32:43 +0400 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2012-09-07 15:32:43 +0400 |
commit | 4986de84ad0a7b70e8cd4788564d13ad6f03e016 (patch) | |
tree | 645198395ca88e3f6cd74dc67e5ede2171478277 | |
parent | 12ab6a4f3cae9a3100eecba616824a3c040672fc (diff) | |
download | mariadb-git-4986de84ad0a7b70e8cd4788564d13ad6f03e016.tar.gz |
Cassandra SE: added support for boolean type.
-rw-r--r-- | mysql-test/r/cassandra.result | 10 | ||||
-rw-r--r-- | mysql-test/t/cassandra.test | 15 | ||||
-rw-r--r-- | storage/cassandra/ha_cassandra.cc | 31 |
3 files changed, 56 insertions, 0 deletions
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)) |