Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/data_type.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,8 @@ struct IsValidDataType<cass_bool_t> {
template<>
struct IsValidDataType<CassString> {
bool operator()(CassString, const DataType::ConstPtr& data_type) const {
return is_string_type(data_type->value_type());
// Also allow "bytes" types to be bound as "string" types
return is_string_type(data_type->value_type()) || is_bytes_type(data_type->value_type());
}
};

Expand Down
47 changes: 47 additions & 0 deletions test/integration_tests/src/test_basics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -691,4 +691,51 @@ BOOST_AUTO_TEST_CASE(unset_parameters)
BOOST_CHECK(test_utils::Value<CassString>::equal(value, CassString("value1")));
}

/**
* Bind a blob as a string (char*).
*
* Verify that a "blob" can be bound using the string function. This was
* allowed in previous versions of the driver.
*
* @since 2.3
* @test_category basic
*
*/
BOOST_AUTO_TEST_CASE(bind_blob_as_string)
{
std::string table_name = str(boost::format("table_%s") % test_utils::generate_unique_str(uuid_gen));

test_utils::execute_query(session,
str(boost::format("CREATE TABLE %s (key text PRIMARY KEY, value blob)") % table_name));

std::string insert_query = str(boost::format("INSERT INTO %s (key, value) VALUES(?, ?)") % table_name);

// Prepared needed to validate bind type information
test_utils::CassPreparedPtr prepared = test_utils::prepare(session, insert_query);
test_utils::CassStatementPtr statement(test_utils::CassStatementPtr(cass_prepared_bind(prepared.get())));

BOOST_CHECK_EQUAL(cass_statement_bind_string(statement.get(), 0, "key1"), CASS_OK);

// Verify that a blob can be bound as a string
BOOST_CHECK_EQUAL(cass_statement_bind_string(statement.get(), 1, "value1"), CASS_OK);

test_utils::CassFuturePtr future(cass_session_execute(session, statement.get()));

CassError rc = cass_future_error_code(future.get());
BOOST_REQUIRE(rc == CASS_OK);

test_utils::CassResultPtr result;
test_utils::execute_query(session,
str(boost::format("SELECT * FROM %s") % table_name), &result);

// Check to make sure the known values are still present
CassString key;
CassString value;
const CassRow* row = cass_result_first_row(result.get());
test_utils::Value<CassString>::get(cass_row_get_column(row, 0), &key);
test_utils::Value<CassString>::get(cass_row_get_column(row, 1), &value);
BOOST_CHECK(test_utils::Value<CassString>::equal(key, CassString("key1")));
BOOST_CHECK(test_utils::Value<CassString>::equal(value, CassString("value1")));
}

BOOST_AUTO_TEST_SUITE_END()