Skip to content

Commit

Permalink
fix(tianmu): fix up the incompatible type
Browse files Browse the repository at this point in the history
1) In result value setup phase, it only deals with num, but in some case, some non-num types
involved, therefore, we should also deal with these types.

2) To fixup the boundary of the error codes.
  • Loading branch information
RingsC authored and mergify[bot] committed May 26, 2023
1 parent d99c9d5 commit 2579bd4
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 10 deletions.
2 changes: 1 addition & 1 deletion include/mysqld_error.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#define MYSQLD_ERROR_INCLUDED

static const int errmsg_section_start[] = { 1000, 3000 };
static const int errmsg_section_size[] = { 889, 234 };
static const int errmsg_section_size[] = { 889, 244 };

#define ER_HASHCHK 1000
#define ER_NISAMCHK 1001
Expand Down
11 changes: 11 additions & 0 deletions mysql-test/suite/tianmu/r/issue1808.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
DROP DATABASE IF EXISTS issue1808_test;
CREATE DATABASE issue1808_test;
USE issue1808_test;
SELECT c1 FROM ttt UNION ALL SELECT 'aaa' c1 FROM (SELECT c2 FROM ttt WHERE c1 IN (3000000000027265)) x ORDER BY c1;
c1
3000000000027266
3000000000027267
3000000000027268
3000000000027269
3000000000027270
DROP DATABASE issue1808_test;
2 changes: 1 addition & 1 deletion mysql-test/suite/tianmu/t/issue1637-master.opt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
--tianmu_mandatory=ON
--tianmu_no_key_error=ON
--tianmu_insert_delayed=1
--tianmu_insert_delayed=0
4 changes: 3 additions & 1 deletion mysql-test/suite/tianmu/t/issue1637.test
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ insert into ttt values(2,'bbb');
--disable_warnings
insert ignore into ttt values(2,'ccc');
--enable_warnings
sleep 1;

sleep 2;

select * from ttt;

DROP DATABASE issue1637_test;
20 changes: 20 additions & 0 deletions mysql-test/suite/tianmu/t/issue1808.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
--source include/have_tianmu.inc

--disable_warnings
DROP DATABASE IF EXISTS issue1808_test;

CREATE DATABASE issue1808_test;

USE issue1808_test;

--enable_warnings
--disable_query_log

CREATE TABLE ttt(c1 decimal(18,0),c2 decimal(18,0));
INSERT INTO ttt VALUES(3000000000027266,1),(3000000000027267,1),(3000000000027268,1),(3000000000027269,1),(3000000000027270,1);

--enable_query_log
SELECT c1 FROM ttt UNION ALL SELECT 'aaa' c1 FROM (SELECT c2 FROM ttt WHERE c1 IN (3000000000027265)) x ORDER BY c1;

DROP DATABASE issue1808_test;

26 changes: 19 additions & 7 deletions storage/tianmu/core/temp_table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2159,33 +2159,45 @@ void TempTable::RecordIterator::PrepareValues() {
if (v == common::NULL_VALUE_32)
dataTypes[att]->SetToNull();
else
((types::TianmuNum *)dataTypes[att].get())->Assign(v, 0, false, attrt_tmp);
(dynamic_cast<types::TianmuNum *>(dataTypes[att].get()))->Assign(v, 0, false, attrt_tmp);
} else if (attrt_tmp == common::ColumnType::SMALLINT) {
short &v = (*(AttrBuffer<short> *)table->GetDisplayableAttrP(att)->buffer)[_currentRNo];
if (v == common::NULL_VALUE_SH)
dataTypes[att]->SetToNull();
else
((types::TianmuNum *)dataTypes[att].get())->Assign(v, 0, false, attrt_tmp);
(dynamic_cast<types::TianmuNum *>(dataTypes[att].get()))->Assign(v, 0, false, attrt_tmp);
} else if (attrt_tmp == common::ColumnType::BYTEINT) {
char &v = (*(AttrBuffer<char> *)table->GetDisplayableAttrP(att)->buffer)[_currentRNo];
if (v == common::NULL_VALUE_C)
dataTypes[att]->SetToNull();
else
((types::TianmuNum *)dataTypes[att].get())->Assign(v, 0, false, attrt_tmp);
(dynamic_cast<types::TianmuNum *>(dataTypes[att].get()))->Assign(v, 0, false, attrt_tmp);
} else if (ATI::IsRealType(attrt_tmp)) {
double &v = (*(AttrBuffer<double> *)table->GetDisplayableAttrP(att)->buffer)[_currentRNo];
if (v == NULL_VALUE_D)
dataTypes[att]->SetToNull();
else
((types::TianmuNum *)dataTypes[att].get())->Assign(v);
(dynamic_cast<types::TianmuNum *>(dataTypes[att].get()))->Assign(v);
} else if (attrt_tmp == common::ColumnType::NUM || attrt_tmp == common::ColumnType::BIGINT ||
attrt_tmp == common::ColumnType::BIT) {
int64_t &v = (*(AttrBuffer<int64_t> *)table->GetDisplayableAttrP(att)->buffer)[_currentRNo];
if (v == common::NULL_VALUE_64)
dataTypes[att]->SetToNull();
else
((types::TianmuNum *)dataTypes[att].get())
->Assign(v, table->GetDisplayableAttrP(att)->Type().GetScale(), false, attrt_tmp);
else {
if (dataTypes[att].get()->GetValueType() == types::ValueTypeEnum::NUMERIC_TYPE)
(dynamic_cast<types::TianmuNum *>(dataTypes[att].get()))
->Assign(v, table->GetDisplayableAttrP(att)->Type().GetScale(), false, attrt_tmp);
if (dataTypes[att].get()->GetValueType() == types::ValueTypeEnum::STRING_TYPE) {
std::ostringstream stringStream;
stringStream << v;
std::string copyOfStr = stringStream.str();

char *vstr_p = const_cast<char *>(copyOfStr.c_str());
types::BString bs(vstr_p, strlen(vstr_p), true);
(dynamic_cast<types::BString *>(dataTypes[att].get()))->PersistentCopy(bs);
}
// process bstring type.
}
} else if (ATI::IsDateTimeType(attrt_tmp)) {
int64_t &v = (*(AttrBuffer<int64_t> *)table->GetDisplayableAttrP(att)->buffer)[_currentRNo];
if (v == common::NULL_VALUE_64)
Expand Down

0 comments on commit 2579bd4

Please sign in to comment.