diff --git a/dbcon/joblist/crossenginestep.cpp b/dbcon/joblist/crossenginestep.cpp index 98098fe62..505b17de4 100644 --- a/dbcon/joblist/crossenginestep.cpp +++ b/dbcon/joblist/crossenginestep.cpp @@ -247,7 +247,7 @@ void CrossEngineStep::makeMappings() } -void CrossEngineStep::setField(int i, const char* value, Row& row) +void CrossEngineStep::setField(int i, const char* value, drizzle_column_st* field, Row& row) { CalpontSystemCatalog::ColDataType colType = row.getColType(i); @@ -263,9 +263,17 @@ void CrossEngineStep::setField(int i, const char* value, Row& row) { CalpontSystemCatalog::ColType ct; ct.colDataType = colType; - ct.colWidth = row.getColumnWidth(i); - ct.scale = row.getScale(i); - ct.precision = row.getPrecision(i); + ct.colWidth = row.getColumnWidth(i); + if (colType == CalpontSystemCatalog::DECIMAL) + { + ct.scale = field->decimals; + ct.precision = field->size; + } + else + { + ct.scale = row.getScale(i); + ct.precision = row.getPrecision(i); + } row.setIntField(convertValueNum(value, ct, row.getSignedNullValue(i)), i); } } @@ -500,7 +508,7 @@ void CrossEngineStep::execute() while ((rowIn = drizzle->nextRow()) && !cancelled()) { for(int i = 0; i < num_fields; i++) - setField(i, rowIn[i], fRowDelivered); + setField(i, rowIn[i], drizzle->getField(i), fRowDelivered); addRow(rgDataDelivered); } @@ -520,7 +528,7 @@ void CrossEngineStep::execute() for(int i = 0; i < num_fields; i++) { if (fFe1Column[i] != -1) - setField(fFe1Column[i], rowIn[i], rowFe1); + setField(fFe1Column[i], rowIn[i], drizzle->getField(i), rowFe1); } if (fFeFilters && fFeInstance->evaluate(rowFe1, fFeFilters.get()) == false) @@ -534,7 +542,7 @@ void CrossEngineStep::execute() for(int i = 0; i < num_fields; i++) { if (fFe1Column[i] == -1) - setField(i, rowIn[i], fRowDelivered); + setField(i, rowIn[i], drizzle->getField(i), fRowDelivered); } addRow(rgDataDelivered); @@ -552,7 +560,7 @@ void CrossEngineStep::execute() while ((rowIn = drizzle->nextRow()) && !cancelled()) { for(int i = 0; i < num_fields; i++) - setField(i, rowIn[i], rowFe3); + setField(i, rowIn[i], drizzle->getField(i), rowFe3); fFeInstance->evaluate(rowFe3, fFeSelects); fFeInstance->evaluate(rowFe3, fFeSelects); @@ -583,7 +591,7 @@ void CrossEngineStep::execute() for(int i = 0; i < num_fields; i++) { if (fFe1Column[i] != -1) - setField(fFe1Column[i], rowIn[i], rowFe1); + setField(fFe1Column[i], rowIn[i], drizzle->getField(i), rowFe1); } if (fFeFilters && fFeInstance->evaluate(rowFe1, fFeFilters.get()) == false) @@ -597,7 +605,7 @@ void CrossEngineStep::execute() for(int i = 0; i < num_fields; i++) { if (fFe1Column[i] == -1) - setField(i, rowIn[i], rowFe3); + setField(i, rowIn[i], drizzle->getField(i), rowFe3); } fFeInstance->evaluate(rowFe3, fFeSelects); diff --git a/dbcon/joblist/crossenginestep.h b/dbcon/joblist/crossenginestep.h index a0f21cc50..2c8411413 100644 --- a/dbcon/joblist/crossenginestep.h +++ b/dbcon/joblist/crossenginestep.h @@ -60,6 +60,7 @@ public: int getRowCount() { return drizzle_result_row_count(fDrzrp); } char** nextRow() { return drizzle_row_next(fDrzrp); } const string& getError() { return fErrStr; } + drizzle_column_st* getField(int field) { return drizzle_column_index(fDrzrp, field); } private: drizzle_st* fDrzp; @@ -149,7 +150,7 @@ protected: virtual void makeMappings(); virtual void addFilterStr(const std::vector&, const std::string&); virtual std::string makeQuery(); - virtual void setField(int, const char*, rowgroup::Row&); + virtual void setField(int, const char*, drizzle_column_st*, rowgroup::Row&); inline void addRow(rowgroup::RGData &); //inline void addRow(boost::shared_array&); virtual int64_t convertValueNum(