修复decimal解析错误问题,统一以%.15g输出

This commit is contained in:
blue-lemon0104
2026-04-17 13:05:30 +08:00
parent 675146e477
commit 47c20574f7
4 changed files with 116 additions and 65 deletions

View File

@@ -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();
} }

View File

@@ -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;
} }

View File

@@ -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);

View File

@@ -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();