修复decimal解析错误问题,统一以%.15g输出
This commit is contained in:
@@ -104,15 +104,15 @@ void decryptResult(int numberAttr, int numTuples, pAttrDescs pattDescs, pTuples
|
|||||||
else
|
else
|
||||||
ctype = TYPE_INTEGER;
|
ctype = TYPE_INTEGER;
|
||||||
|
|
||||||
void (*anyTypetoString)(const char *, char *const, void *) = NULL; // 把buffer转为相应类型的数据。
|
void (*anyTypetoString)(const char *, char *const, void *) = NULL; // 把buffer转为相应类型的数据。
|
||||||
switch (ctype) {
|
switch (ctype) {
|
||||||
// case TYPE_FLOAT:
|
case TYPE_FLOAT:
|
||||||
// anyTypetoString = &FloatTypetoString;
|
anyTypetoString = &DoubleTypetoString;
|
||||||
// break;
|
break;
|
||||||
|
|
||||||
case TYPE_STRING:
|
case TYPE_STRING:
|
||||||
|
|
||||||
anyTypetoString = NULL; //无需转换
|
anyTypetoString = NULL; //无需转换
|
||||||
break;
|
break;
|
||||||
case TYPE_INTEGER:
|
case TYPE_INTEGER:
|
||||||
anyTypetoString = &IntTypetoString;
|
anyTypetoString = &IntTypetoString;
|
||||||
@@ -166,15 +166,12 @@ void decryptResult(int numberAttr, int numTuples, pAttrDescs pattDescs, pTuples
|
|||||||
(char*)dek.c_str(), // 使用DEK
|
(char*)dek.c_str(), // 使用DEK
|
||||||
(char*)aesOut.get()
|
(char*)aesOut.get()
|
||||||
);
|
);
|
||||||
// 确保输出大小正确
|
// 确保输出大小正确
|
||||||
if (outSize >= sizeof(double)) {
|
if (outSize >= sizeof(double)) {
|
||||||
double d = *(double*)aesOut.get();
|
DoubleTypetoString((const char*)aesOut.get(), tuples[i][j].value, (void *) coltypename.get());
|
||||||
std::ostringstream ss;
|
}
|
||||||
ss << d;
|
delete[] buff;
|
||||||
strcpy(tuples[i][j].value, ss.str().c_str());
|
} else {
|
||||||
}
|
|
||||||
delete[] buff;
|
|
||||||
} else {
|
|
||||||
size_t buffSZ = tuples[i][j].len / 2 + 1; // 密文buffer长度, 应该大于hexstr长度的一半
|
size_t buffSZ = tuples[i][j].len / 2 + 1; // 密文buffer长度, 应该大于hexstr长度的一半
|
||||||
size_t plainBuffSZ = buffSZ;
|
size_t plainBuffSZ = buffSZ;
|
||||||
uint8_t *plainBuff = nullptr;
|
uint8_t *plainBuff = nullptr;
|
||||||
@@ -211,15 +208,15 @@ void decryptResult(int numberAttr, int numTuples, pAttrDescs pattDescs, pTuples
|
|||||||
std::string dek;
|
std::string dek;
|
||||||
// cmk_mapperGetDekByCol(cipherColName,dek);
|
// cmk_mapperGetDekByCol(cipherColName,dek);
|
||||||
DekInterface::getDekColLevel(cipherColName, dek);
|
DekInterface::getDekColLevel(cipherColName, dek);
|
||||||
plainBuff = encryptValue(type, pbuff, buffSZ, &plainBuffSZ, dek.c_str(), false);
|
plainBuff = encryptValue(type, pbuff, buffSZ, &plainBuffSZ, dek.c_str(), false);
|
||||||
//KMS test end;
|
//KMS test end;
|
||||||
// plainBuff = encryptValue(t, pbuff, buffSZ, &plainBuffSZ, false);
|
// plainBuff = encryptValue(t, pbuff, buffSZ, &plainBuffSZ, false);
|
||||||
if (anyTypetoString) {
|
if (anyTypetoString) {
|
||||||
//fixed by qxy for RND
|
//fixed by qxy for RND
|
||||||
if (type == CIPHER_RND) {
|
if (type == CIPHER_RND && ctype != TYPE_FLOAT) {
|
||||||
long l = *(long *)plainBuff;
|
long l = *(long *)plainBuff;
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
ss << l;
|
ss << l;
|
||||||
strcpy(tuples[i][j].value, ss.str().c_str());
|
strcpy(tuples[i][j].value, ss.str().c_str());
|
||||||
} else {
|
} else {
|
||||||
anyTypetoString((const char *) plainBuff, tuples[i][j].value, (void *) coltypename.get());
|
anyTypetoString((const char *) plainBuff, tuples[i][j].value, (void *) coltypename.get());
|
||||||
@@ -264,4 +261,4 @@ void decryptResult(int numberAttr, int numTuples, pAttrDescs pattDescs, pTuples
|
|||||||
counter->count("SQL Decryption", timer.passedTimeMicroSecond());
|
counter->count("SQL Decryption", timer.passedTimeMicroSecond());
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,24 @@ bool IsInt8ColumnType(const char* type_name)
|
|||||||
return type.find("int8") != std::string::npos || type.find("bigint") != std::string::npos;
|
return type.find("int8") != std::string::npos || type.find("bigint") != std::string::npos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsFloatColumnType(const char* type_name)
|
||||||
|
{
|
||||||
|
return type_name && unifyColumnType(type_name) == TYPE_FLOAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ShouldSetPeerFloat(const char* type_name, EncryptInfo* info)
|
||||||
|
{
|
||||||
|
if (!IsFloatColumnType(type_name))
|
||||||
|
return false;
|
||||||
|
if (!strcmp(type_name, "float"))
|
||||||
|
return true;
|
||||||
|
if (!info || !IsA((Node *) info->father, A_Expr))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const char* op = getAExprOp((A_Expr *) info->father);
|
||||||
|
return op && !strcmp(op, "=");
|
||||||
|
}
|
||||||
|
|
||||||
bool TryParseInt64Literal(const char* literal, int64_t* value)
|
bool TryParseInt64Literal(const char* literal, int64_t* value)
|
||||||
{
|
{
|
||||||
if (!literal || !value)
|
if (!literal || !value)
|
||||||
@@ -224,15 +242,29 @@ static A_Const *encryptAConst(A_Const *aconst, T_Cipher encryptCipher, EncryptIn
|
|||||||
}
|
}
|
||||||
plainText = (uint8_t *) tmpInt;
|
plainText = (uint8_t *) tmpInt;
|
||||||
in_size = sizeof(int64_t);
|
in_size = sizeof(int64_t);
|
||||||
} else if (encryptCipher == CIPHER_RND) {
|
} else if (encryptCipher == CIPHER_RND || encryptCipher == CIPHER_RNDSM4CK) {
|
||||||
*tmpInt = intVal(AConstValue);
|
if (isFloat || info->isPeerColFloat || IsA(AConstValue, Float)) {
|
||||||
// isFloat = true;
|
isFloat = true;
|
||||||
// *tmpInt *= Float_Scale;
|
if (IsA(AConstValue, Integer)) {
|
||||||
|
tmpDouble = static_cast<double>(intVal(AConstValue));
|
||||||
|
} else {
|
||||||
|
tmpDouble = atof(strVal(AConstValue));
|
||||||
|
}
|
||||||
|
plainText = (uint8_t *) &tmpDouble;
|
||||||
|
in_size = sizeof(double);
|
||||||
|
} else {
|
||||||
|
*tmpInt = intVal(AConstValue);
|
||||||
|
// isFloat = true;
|
||||||
|
// *tmpInt *= Float_Scale;
|
||||||
|
plainText = (uint8_t *) tmpInt;
|
||||||
|
in_size = sizeof(int64_t);
|
||||||
|
}
|
||||||
|
if (info->isPeerColFloat) {
|
||||||
|
info->isPeerColFloat = false;
|
||||||
|
}
|
||||||
if (info->isPeerColInt8) {
|
if (info->isPeerColInt8) {
|
||||||
info->isPeerColInt8 = false;
|
info->isPeerColInt8 = false;
|
||||||
}
|
}
|
||||||
plainText = (uint8_t *) tmpInt;
|
|
||||||
in_size = sizeof(int64_t);
|
|
||||||
} else if (IsA(AConstValue, Float)) //
|
} else if (IsA(AConstValue, Float)) //
|
||||||
{
|
{
|
||||||
isFloat = true;
|
isFloat = true;
|
||||||
@@ -257,17 +289,28 @@ static A_Const *encryptAConst(A_Const *aconst, T_Cipher encryptCipher, EncryptIn
|
|||||||
plainText = (uint8_t *) &tmpDouble;
|
plainText = (uint8_t *) &tmpDouble;
|
||||||
in_size = sizeof(double);
|
in_size = sizeof(double);
|
||||||
} else if (IsA(AConstValue, Integer)) {
|
} else if (IsA(AConstValue, Integer)) {
|
||||||
*tmpInt = intVal(AConstValue);
|
if (isFloat || info->isPeerColFloat) {
|
||||||
// isFloat = true;
|
isFloat = true;
|
||||||
isFloat = false;
|
tmpDouble = static_cast<double>(intVal(AConstValue));
|
||||||
// *tmpInt *= Float_Scale;
|
plainText = (uint8_t *) &tmpDouble;
|
||||||
|
in_size = sizeof(double);
|
||||||
|
if (info->isPeerColFloat) {
|
||||||
|
info->isPeerColFloat = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*tmpInt = intVal(AConstValue);
|
||||||
|
// isFloat = true;
|
||||||
|
isFloat = false;
|
||||||
|
// *tmpInt *= Float_Scale;
|
||||||
|
plainText = (uint8_t *) tmpInt;
|
||||||
|
in_size = sizeof(int64_t);
|
||||||
|
}
|
||||||
if (info->isPeerColInt8) {
|
if (info->isPeerColInt8) {
|
||||||
info->isPeerColInt8 = false;
|
info->isPeerColInt8 = false;
|
||||||
}
|
}
|
||||||
plainText = (uint8_t *) tmpInt;
|
|
||||||
in_size = sizeof(int64_t);
|
|
||||||
} else {
|
} else {
|
||||||
*tmpInt = intVal(AConstValue);
|
*tmpInt = intVal(AConstValue);
|
||||||
|
tmpDouble = static_cast<double>(*tmpInt);
|
||||||
// if (info->isFloatorIntCol) { // 当前列是float或Int列
|
// if (info->isFloatorIntCol) { // 当前列是float或Int列
|
||||||
// isFloat = true;
|
// isFloat = true;
|
||||||
// *tmpInt *= Float_Scale;
|
// *tmpInt *= Float_Scale;
|
||||||
@@ -611,14 +654,14 @@ static ColumnRef *encryptColumnRef(ColumnRef *cref, T_Cipher encryptCipher, Encr
|
|||||||
}
|
}
|
||||||
cipherColNameValue = makeString((char *) cipherColName);
|
cipherColNameValue = makeString((char *) cipherColName);
|
||||||
newCref->fields = lappend(newCref->fields, cipherColNameValue);
|
newCref->fields = lappend(newCref->fields, cipherColNameValue);
|
||||||
p = lnext(p);
|
p = lnext(p);
|
||||||
char typebuf[128];
|
char typebuf[128];
|
||||||
if (IsA((Node *) info->father, A_Expr)) {
|
if (IsA((Node *) info->father, A_Expr)) {
|
||||||
getColumnType(name, typebuf);
|
getColumnType(name, typebuf);
|
||||||
if (!strcmp(typebuf, "float")) {
|
if (ShouldSetPeerFloat(typebuf, info)) {
|
||||||
info->isPeerColFloat = true;
|
info->isPeerColFloat = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return newCref;
|
return newCref;
|
||||||
}
|
}
|
||||||
@@ -1581,8 +1624,8 @@ static List *encryptValuesLists(List *valuesLists, List *cols, EncryptInfo *info
|
|||||||
// info->isFloatorIntCol = true;
|
// info->isFloatorIntCol = true;
|
||||||
// } else {
|
// } else {
|
||||||
// info->isFloatorIntCol = false;
|
// info->isFloatorIntCol = false;
|
||||||
// }
|
// }
|
||||||
if (string(colInfo->type).find("float") != string::npos)
|
if (IsFloatColumnType(colInfo->type))
|
||||||
{
|
{
|
||||||
info->isFloatCol = true;
|
info->isFloatCol = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -429,10 +429,10 @@ void IntTypetoString(const char *buf, char *const v, void *others) {
|
|||||||
strcpy(v, ss.str().c_str());
|
strcpy(v, ss.str().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FloatTypetoString(const char *buf, char *v,
|
void FloatTypetoString(const char *buf, char *v,
|
||||||
void *others) // TODO: // buf 不一定是 double的内存排布,还有可能是long, 因为词法分析不区分 (long)1, (double)1
|
void *others) // TODO: // buf 不一定是 double的内存排布,还有可能是long, 因为词法分析不区分 (long)1, (double)1
|
||||||
{
|
{
|
||||||
long l = *(long *) buf;
|
long l = *(long *) buf;
|
||||||
double f = (l / Float_Scale) * 1.0;
|
double f = (l / Float_Scale) * 1.0;
|
||||||
sprintf(v, "%.10f", f);
|
sprintf(v, "%.10f", f);
|
||||||
size_t sz = strlen(v);
|
size_t sz = strlen(v);
|
||||||
@@ -454,13 +454,22 @@ void FloatTypetoString(const char *buf, char *v,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*c = '\0';
|
*c = '\0';
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FloatTypetoString2(const char *buf, char *v,
|
void DoubleTypetoString(const char *buf, char *v, void *others)
|
||||||
void *others) // TODO: // buf 不一定是 double的内存排布,还有可能是long, 因为词法分析不区分 (long)1, (double)1
|
{
|
||||||
{
|
double d = 0.0;
|
||||||
|
memcpy(&d, buf, sizeof(double));
|
||||||
|
sprintf(v, "%.15g", d);
|
||||||
|
if (!strcmp(v, "-0"))
|
||||||
|
strcpy(v, "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
void FloatTypetoString2(const char *buf, char *v,
|
||||||
|
void *others) // TODO: // buf 不一定是 double的内存排布,还有可能是long, 因为词法分析不区分 (long)1, (double)1
|
||||||
|
{
|
||||||
long l = *(long *) buf;
|
long l = *(long *) buf;
|
||||||
double f = l * 1.0;
|
double f = l * 1.0;
|
||||||
sprintf(v, "%.10f", f);
|
sprintf(v, "%.10f", f);
|
||||||
|
|||||||
@@ -151,9 +151,11 @@ COLUMN_TYPE unifyColumnType(const std::string &s);
|
|||||||
|
|
||||||
void IntTypetoString(const char *buf, char *const v, void *others);
|
void IntTypetoString(const char *buf, char *const v, void *others);
|
||||||
|
|
||||||
void FloatTypetoString(const char *buf, char *const v, void *others);
|
void FloatTypetoString(const char *buf, char *const v, void *others);
|
||||||
|
|
||||||
void FloatTypetoString2(const char *buf, char *const v, void *others);
|
void DoubleTypetoString(const char *buf, char *const v, void *others);
|
||||||
|
|
||||||
|
void FloatTypetoString2(const char *buf, char *const v, void *others);
|
||||||
|
|
||||||
void FloatTypetoString3(const char *buf, char *const v, void *others);
|
void FloatTypetoString3(const char *buf, char *const v, void *others);
|
||||||
|
|
||||||
@@ -174,4 +176,4 @@ long GetCurrentTimestamp(void);
|
|||||||
|
|
||||||
void fmttime(time_t lt1, char *res);
|
void fmttime(time_t lt1, char *res);
|
||||||
|
|
||||||
uint64_t mygettid();
|
uint64_t mygettid();
|
||||||
|
|||||||
Reference in New Issue
Block a user