Details
- 
    
Bug
 - 
    Status: Closed (View Workflow)
 - 
    
Critical
 - 
    Resolution: Fixed
 - 
    1.1.5, 1.2.1
 - 
    None
 - 
    None
 - 
    single node docker image
 
- 
        2018-16, 2018-17, 2018-18, 2018-19, 2018-20, 2018-21
 
Description
The following test case creates a table, inserts a row into it via mcsapi and updates it after the bulk load has committed.
					#include <iostream>
			 | 
		
					#include <string>
			 | 
		
					#include <sstream>
			 | 
		
| 
					 | 
		
					#include <mysql.h>
			 | 
		
					#include <libmcsapi/mcsapi.h>
			 | 
		
| 
					 | 
		
					#include <boost/property_tree/ptree.hpp>
			 | 
		
					#include <boost/property_tree/xml_parser.hpp>
			 | 
		
					namespace pt = boost::property_tree;  | 
		
| 
					 | 
		
					int main(int argc, char** argv)  | 
		
					{
			 | 
		
					if (argc != 3)  | 
		
					    {
			 | 
		
					std::cout << "Usage: DATABASE TABLE" << std::endl  | 
		
					<< "Columnstore.xml must be located in /usr/local/mariadb/columnstore/etc/Columnstore.xml" << std::endl;  | 
		
					return 1;  | 
		
					    }
			 | 
		
| 
					 | 
		
					// Read the credentials from the Columnstore.xml  | 
		
					    pt::ptree tree;
			 | 
		
					pt::read_xml("/usr/local/mariadb/columnstore/etc/Columnstore.xml", tree);  | 
		
					std::string host = tree.get<std::string>("Columnstore.CrossEngineSupport.Host");  | 
		
					int port = tree.get<int>("Columnstore.CrossEngineSupport.Port");  | 
		
					std::string user = tree.get<std::string>("Columnstore.CrossEngineSupport.User");  | 
		
					std::string password = tree.get<std::string>("Columnstore.CrossEngineSupport.Password");  | 
		
					    std::string database = argv[1];
			 | 
		
					    std::string table = argv[2];
			 | 
		
| 
					 | 
		
					// Connect to CS and create the table  | 
		
					    auto mysql =  mysql_init(nullptr);
			 | 
		
					    mysql_real_connect(mysql, host.c_str(), user.c_str(),
			 | 
		
					                       password.empty() ? NULL : password.c_str(),
			 | 
		
					                       NULL, port, NULL, 0);
			 | 
		
| 
					 | 
		
					    std::stringstream query;
			 | 
		
					query << "CREATE TABLE " << database << "." << table << "(id int, data varchar(200)) ENGINE=Columnstore";  | 
		
					    mysql_query(mysql, query.str().c_str());
			 | 
		
| 
					 | 
		
					// Connect with mcsapi and insert one row with a bulk insert  | 
		
					auto driver = new mcsapi::ColumnStoreDriver(cnf);  | 
		
					    auto bulk = driver->createBulkInsert(database, table, 0, 0);
			 | 
		
					    auto info = driver->getSystemCatalog().getTable(database, table);
			 | 
		
					uint32_t pos1 = info.getColumn("id").getPosition();  | 
		
					uint32_t pos2 = info.getColumn("data").getPosition();  | 
		
					    bulk->setColumn(pos1, 1);
			 | 
		
					bulk->setColumn(pos2, "hello");  | 
		
					    bulk->writeRow();
			 | 
		
					    bulk->commit();
			 | 
		
| 
					 | 
		
					// Update the row we just inserted  | 
		
					    std::stringstream query;
			 | 
		
					query << "UPDATE `" << database << "`.`" << table << "` SET `id` = 1, `data` = 'Hello' WHERE `id` = 1 AND `data` = 'hello'";  | 
		
					    mysql_query(mysql, query.str().c_str());
			 | 
		
| 
					 | 
		
					return 0;  | 
		
					}
			 | 
		
Once the update is done, the data in the table is corrupted:
					MariaDB [test]> select * from test.t1;
			 | 
		
					+------+----------+
			 | 
		
					| id   | data     |
			 | 
		
					+------+----------+
			 | 
		
					|    1 | _CpNoTf_ |
			 | 
		
					+------+----------+
			 | 
		
					1 row in set (0.05 sec)
			 | 
		
Manually updating it afterwards doesn't fix it, it still remains invalid:
					MariaDB [test]> update test.t1 set data = "Hello" where id = 1;
			 | 
		
					Query OK, 1 row affected (0.15 sec)
			 | 
		
					Rows matched: 0  Changed: 0  Warnings: 0
			 | 
		
| 
					 | 
		
					MariaDB [test]> select * from test.t1;
			 | 
		
					+------+----------+
			 | 
		
					| id   | data     |
			 | 
		
					+------+----------+
			 | 
		
					|    1 | _CpNoTf_ |
			 | 
		
					+------+----------+
			 | 
		
					1 row in set (0.02 sec)
			 | 
		
Additional note from Andrew: This also happens when using INSERT...SELECT and LDI when cpimport mode is not used.