[CBRD-26397] (Phase-3) Support for Floating-Point NUMERIC Type#6671
[CBRD-26397] (Phase-3) Support for Floating-Point NUMERIC Type#6671jongmin-won wants to merge 47 commits intoCUBRID:feature/scale_range_fp_numericfrom
Conversation
…1 and phase-2 for validating numeric results has been reverted to its original implementation.
2. Improved implicit type casting and common type selection for numeric operations
…oat Numeric range
and readability and comment improvements for scale adjustment (mul_normalize)
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
2. Fixed the missing Fixed Numeric condition in the Hash Join execution path
… from 43 to 38 2. Optimized the performance of the existing numeric_compare function
…tion. This assertion is applied only when the internal buffer represents a positive magnitude value. For two's-complement negative buffers used in comparison paths, a non-zero carry is a valid outcome and therefore excluded from this assertion. 2. Updated SERIAL and AUTO_INCREMENT behavior so that an error is raised when the current value exceeds precision 38, matching the behavior of the develop branch.
…meric 2. Unify the conditional logic so that AUTO_INCREMENT columns using the NUMERIC default always operate as (38,0) 3. Improve behavior when MODIFY/CHANGE increases the precision of a NUMERIC column
…ns either stored 11 instead of 1, or resulted in a Cannot coerce error.
… valid buffer range.
…or certain arithmetic operations (+, -, *).
| * when comparing with TP_DOMAIN, use db_value_precision() and db_value_scale() instead. | ||
| */ | ||
| void | ||
| db_get_numeric_precision_and_scale (const DB_VALUE * value, int *precision_ptr, int *scale_ptr, |
There was a problem hiding this comment.
precision_ptr, scale_ptr 가 유효한지 NULL 체크 코드가 필요해 보입니다.
There was a problem hiding this comment.
리뷰 감사합니다.
c6485eb 커밋에서 말씀해주신 내용을 반영하여 수정했습니다.
pl_engine/pl_server/src/main/java/com/cubrid/plcsql/compiler/visitor/TypeChecker.java
Outdated
Show resolved
Hide resolved
pl_engine/pl_server/src/main/java/com/cubrid/plcsql/predefined/sp/SpLib.java
Show resolved
Hide resolved
…cub_server behavior from the type-checking phase to a later stage after literal validation. 2. During the rollback of the previous common type changes, the PL/CSQL add function missed a required conversion for numeric + string operations to double. This omission has been fixed.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 47 out of 47 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
pl_engine/pl_server/src/main/java/com/cubrid/plcsql/predefined/sp/SpLib.java
Show resolved
Hide resolved
…ts or cause a core dump.
…ndled as FLOAT NUMERIC.
| return NULL; | ||
| } | ||
|
|
||
| if (prec > DB_MAX_NUMERIC_PRECISION || scale > DB_MAX_NUMERIC_SCALE || prec < 0 || scale < DB_MIN_NUMERIC_SCALE) |
There was a problem hiding this comment.
범위 검사가 필요 없어 졌나요?
assert 로라도 남겨두는 것이 좋지 않을까요.
There was a problem hiding this comment.
네, 범위 검사는 필요 없습니다.
pt_make_prim_data_type_fortonum() 함수는 TO_NUMBER() 내장 함수를 수행할 때 PT_DATA_TYPE(DOMAIN) 값을 결정하는 역할을 합니다.
그리고 TO_NUMBER()는 NUMERIC 값을 가공하므로 내부적으로 항상 FLOAT NUMERIC으로 처리됩니다.
따라서 별도의 범위 검사는 불필요합니다.
There was a problem hiding this comment.
그럼, pt_make_prim_data_type_fortonum() 로 넘어오는 인자 prec, scale 는 언제나 DB_MAX_NUMERIC_PRECISION 과 0 이겠군요.
There was a problem hiding this comment.
그렇다면, 인자 prec 와 scale 이 없어지는 것이 좋겠습니다.
| { | ||
| *p_precision = DB_MAX_NUMERIC_PRECISION; | ||
| *p_scale = DB_DEFAULT_NUMERIC_PRECISION; | ||
| *p_scale = DB_LEGACY_DEFAULT_NUMERIC_PRECISION; |
There was a problem hiding this comment.
이 함수 pt_to_regu_resolve_domain() 을 호출하는 곳이 없습니다.
사용하지 않는 함수이므로 pt_to_regu_resolve_domain() 를 지우는 것이 좋을 것 같습니다.
| { | ||
| if (before_dec_point + after_dec_point > DB_MAX_FIXED_NUMERIC_PRECISION || | ||
| after_dec_point > DB_DEFAULT_NUMERIC_PRECISION || before_dec_point > precision - scale) | ||
| after_dec_point > DB_LEGACY_DEFAULT_NUMERIC_PRECISION || before_dec_point > precision - scale) |
There was a problem hiding this comment.
소수점 이후 자리수와 예전 numeric default precision 과 비교하고 있는 듯 합니다.
어떤 의미 일까요.
There was a problem hiding this comment.
해당 함수는 TO_NUMBER() 사용 시 호출되는 함수입니다.
아래 comment의 질문과 동일하게, 해당 로직의 정확한 의도를 명확히 파악하기 어려웠습니다.
따라서 동작 변경을 최소화하기 위해 기존과 동일하게 동작하도록 DB_LEGACY_DEFAULT_NUMERIC_PRECISION(15) 매크로를 추가하여 적용했습니다.
| /* scientific notation */ | ||
| precision = DB_MAX_FIXED_NUMERIC_PRECISION; | ||
| scale = DB_DEFAULT_NUMERIC_PRECISION; | ||
| scale = DB_LEGACY_DEFAULT_NUMERIC_PRECISION; |
There was a problem hiding this comment.
scale 에 precision 값을 대입한다는 것이 어떤 의미일까요.
혹시 15 라는 값을 써야 하는데, DB_LEGACY_DEFAULT_NUMERIC_PRECISION 가 15 값을 가져서 쓴 것일까요.
There was a problem hiding this comment.
해당 함수는 TO_NUMBER() 사용 시 호출되는 함수입니다.
scale에 precision 값을 대입한 이유는 저도 정확히 파악하지 못했습니다.
어떤 의도로 DB_DEFAULT_NUMERIC_PRECISION 값을 scale에 넣었는지 현재로서는 추측이 어렵습니다.
말씀 주신 것처럼 DB_LEGACY_DEFAULT_NUMERIC_PRECISION(15) 매크로를 추가 이유는,
float numeric 도입으로 DB_DEFAULT_NUMERIC_PRECISION 값이 15 -> 40으로 변경되었기 때문입니다.
이로 인해 기존에 DB_DEFAULT_NUMERIC_PRECISION(15)에 의존하던 동작을 유지하기 위해,
기존 값(15)을 대체하는 용도로 DB_LEGACY_DEFAULT_NUMERIC_PRECISION을 추가해 사용했습니다.
-- develop 코드
if (use_default_precision == 1)
{
/* scientific notation */
precision = DB_MAX_NUMERIC_PRECISION; /* 38 */
scale = DB_DEFAULT_NUMERIC_PRECISION; /* 15 */
break;
}
There was a problem hiding this comment.
develop 코드부터 그랬었군요.
위에 after_dec_point > DB_LEGACY_DEFAULT_NUMERIC_PRECISION 비교도 비슷한 상황일 것 같습니다.
값이 15 이면서 적절한 이름을 갖는 다른 매크로 상수를 정의해서 사용하는 것이 좋을 것 같습니다.
There was a problem hiding this comment.
예를 들면,
#define DB_DEFAULT_NUMERIC_SCALE_FOR_TO_NUMBER (15)
…b/mul/div) to always return Float Numeric 2. Fixed an issue where results were returned as Float Numeric during serial/auto_increment-related operations (e.g., nextval) 3. Improved the domain resolution logic for ADD() and AVG() when the argument is numeric 4. Re-added a mistakenly removed call to the NUMERIC negation conversion function 5. Resolved a crash caused by size overflow when using numeric(0) in a view table
…oduced unintended results.
2. Fix errors in the SUM function 3. Fix numeric precision-to-byte conversion LUT formula 4. Fix inconsistent results when executing JOIN with START WITH ... CONNECT BY
|
|
||
| /* Adjust probe domain precision/scale from rest_regu_list for hash list scan */ | ||
| if (probe_regu && xasl->spec_list->s.list_node.list_regu_list_rest) | ||
| { | ||
| REGU_VARIABLE_LIST rest_regu_numeric = NULL; | ||
|
|
||
| /* Find first numeric item in rest_regu_list with fixed precision */ | ||
| for (REGU_VARIABLE_LIST rest_iter = xasl->spec_list->s.list_node.list_regu_list_rest; | ||
| rest_iter != NULL; rest_iter = rest_iter->next) | ||
| { | ||
| if (TP_DOMAIN_TYPE (rest_iter->value.domain) == DB_TYPE_NUMERIC && | ||
| rest_iter->value.domain->precision != DB_DEFAULT_NUMERIC_PRECISION) | ||
| { | ||
| rest_regu_numeric = rest_iter; | ||
| break; | ||
| } | ||
| } | ||
|
|
||
| /* Adjust first numeric probe item if found */ | ||
| if (rest_regu_numeric) | ||
| { | ||
| DB_TYPE vtype1 = REGU_VARIABLE_GET_TYPE (&probe_regu->value); | ||
|
|
||
| if (vtype1 == DB_TYPE_NUMERIC && | ||
| probe_regu->value.domain && probe_regu->value.domain->precision == DB_DEFAULT_NUMERIC_PRECISION) | ||
| { | ||
| /* in START WITH ... CONNECT BY, join and expression evaluation may widen | ||
| * probe_regu_list domain to float numeric. | ||
| * | ||
| * since tp_value_coerce() always casts values to the probe domain, | ||
| * the cast behavior depends on probe_regu_list->value.domain (vtype1's domain). | ||
| * when the probe domain is float numeric, integer values are not scaled, | ||
| * which can produce different hash keys from fixed numeric columns. | ||
| * | ||
| * to avoid this mismatch, restore precision/scale from rest_regu_list | ||
| * when it represents a fixed numeric domain. | ||
| */ | ||
| TP_DOMAIN *new_domain = tp_domain_copy (probe_regu->value.domain, false); | ||
| if (new_domain != NULL) | ||
| { | ||
| new_domain->precision = rest_regu_numeric->value.domain->precision; | ||
| new_domain->scale = rest_regu_numeric->value.domain->scale; | ||
| probe_regu->value.domain = new_domain; | ||
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
관련 TC : _13_issues/_20_2h/cbrd_23749.sql
CREATE TABLE tree(ID numeric(10,2), MgrID INT, Name VARCHAR(32), BirthYear INT);
CREATE TABLE tree(ID numeric(10,2), MgrID INT, Name VARCHAR(32), BirthYear INT);
CREATE TABLE tree2(id int, treeid int, job varchar(32));
INSERT INTO tree VALUES (1,NULL,'Kim', 1963),(2,NULL,'Moy', 1958),(3,1,'Jonas', 1976),(4,1,'Smith', 1974),(5,2,'Verma', 1973),(6,2,'Foster', 1972),(7,6,'Brown', 1981);
INSERT INTO tree2 VALUES(1,1,'Partner'),(2,2,'Partner'),(3,3,'Developer'),(4,4,'Developer'),(5,5,'Sales Exec.'),(6,6,'Sales Exec.'),(7,7,'Assistant'),(8,null,'Secretary');
SELECT t.id FROM tree t INNER JOIN tree2 t2 ON t.id=t2.treeid START WITH t.mgrid is null CONNECT BY prior t.id=t.mgrid ORDER BY t.id;There was a problem hiding this comment.
JOIN + START WITH ... CONNECT BY 수행 시 결과 불일치 문제 수정
- JOIN 수행 결과에 대해 테이블 컬럼의
domain(numeric(10,2))기준으로 hash key가 생성됨. - 그러나
START WITH ... CONNECT BY구문 수행 시,probe_regu_list의 domain이numeric(40,0) (float numeric)으로 변경됨. - 이로 인해
check_hash_list_scan()단계에서 START WITH 절의 int 값이numeric(10,2)가 아닌float numeric기준으로 cast되며,
예를 들어 1 → 1.00 (100)형태로 변환되지 않아 hash key 불일치가 발생함. - probe 값 계산 시, 이전에 hash key를 생성한 numeric domain이
fixed numeric(precision/scale 보유)인 경우,
float numeric값을 해당fixed numeric domain으로 재설정(cast)하도록 수정함. - 이를 통해
hash key생성이 의도한 결과 처럼 생성되어 문제를 해결함.
http://jira.cubrid.org/browse/CBRD-26397
Purpose
Implementation
1. Literal 처리 범위 확장
2. Float Numeric 타입 해석 규칙 추가
TP_DOMAIN및DB_VALUE->domain의 precision 값이DB_DEFAULT_NUMERIC_PRECISION(40)인 경우, 해당 값을 Float Numeric으로 해석하도록 분기 로직을 추가함.3. Float Numeric Overflow / Underflow 처리
4. tp_Numeric(DB_TYPE_NUMERIC) 저장 구조 변경
tp_Numeric(DB_TYPE_NUMERIC)의 저장 구조를고정 길이(fixed)->가변 길이(variable)방식으로 변경함.Fixed Numeric
TP_DOMAIN의 precision 기준으로 데이터 크기를 계산하여 고정 크기로 저장함.Float Numeric
Float Numeric 3B Header 포맷
6: total size (420 bytes)6: precision (140)252(양수 scale), 1214(음수 scale은 절댓값 저장 + 부호는 header[1] bit7)5. AUTO_INCREMENT / SERIAL 동작 수정
AUTO_INCREMENT컬럼이NUMERIC default로 선언된 경우, NUMERIC(38,0)으로 생성되도록 수정함.6. 산술 연산 및 비교 연산
Fixed Numeric으로 저장/읽힌 값이라도, 산술/비교 연산 및 내장 함수 등 가공 시점부터는 내부적으로Float Numeric으로 변환하여 처리함.7. 내장 함수 추가 수정
7-1) CAST()
double의 과학적 표기(예: 1.23e±N) 값을Float Numeric으로 변환할 때, 기존e±38범위를Float Numeric의 표현 범위(precision 1~40, scale -214~252)까지 확장.7-2) MOD()
7-3) ELT()
ELT()수행 과정에서 불필요한 함수 호출을 줄이도록 개선8. Hash Join 동작 변경
9. PL/CSQL Numeric(BigDecimal) 처리 방식 변경
cub_server와 동일한 결과를 출력하도록 parsing 및 산술 연산을 Float Numeric 기반으로 변경cub_server와 동일하게 Numeric Overflow/Underflow 처리(에러/표시)를 추가10. unload/load 유틸리티 수정
11. 시스템 파라미터 정리
compat_numeric_division_scale,stored_procedure_return_numeric_size를 HIDDEN/DEPRECATED로 전환.12. scale 보정(normalize) 성능 최적화
mul_normalize/div_normalize를 10^1 반복 연산 대신, 최대 10^16 단위로 처리하는 base-256 곱/나눗셈 함수로 재작성하여 scale 보정 시 반복 횟수 감소.Remarks
1. 8ec8de6 : domain 이중 포인터 원복
2. 60e2c0e : Float-Point Numeric 타입 지원, 묵시적 형변환 및 공통 타입 처리 수정
3. 939ef35 : unload/load 유틸리티 수정
4. a4c32cd, c079ead : AUTO_INCREMENT 및 SERIAL 수정
이로 인해 byte 크기가 서로 달라 값이 잘못 저장되거나 잘못 읽히는 문제가 발생하던 부분을 수정
5. ef2b46e, 8458a37 : scale 보정(mul_normalize) 곱셈 성능 최적화
6. 22e64b0 , 7173da2, 3c681f9, 43fb7b0, 7b9ed7d, 6df99e4 : Float Numeric 타입 도입에 따른 Hash Join 동작 변경
7. a15e515 : Float Numeric 타입 도입에 따른 PL/CSQL 동작 변경
8. 0f0e66e : Float Numeric 도입에 따른 시스템 파라미터 정리
8-1) compat_numeric_division_scale
8-2) stored_procedure_return_numeric_size
9. 8458a37 : scale 보정(div_normalize) 나눗셈 성능 최적화
10. 43fb7b0 : numeric_compare 함수 성능 최적화
11. 8c116a6 : MODIFY/CHANGE 버그 수정 및 외 2가지 문제 수정
do_create_auto_increment_serial()및do_update_maxvalue_of_auto_increment_serial()함수 수행 전 개별적으로 domain을 변경하던 방식을 제거하고, 상위 조건에서 일관적으로 domain이 (38,0)으로 설정되도록 로직을 통합함.12. 820e444, 51da324 : 정수 컬럼에 소수 값 입력 시 잘못된 변환 동작 수정
13. 6df99e4 : ELT() 내장 함수가 확장된 Float/FIxed Numeric의 scale 범위에서도 올바르게 동작하도록 수정
14. 737da03 : 묵시적 형변환 및 공통 타입 처리 방식 원복
15. 27337fb : 스펙 변경 및 이슈 수정 (3건)
15-1) Float numeric 타입의 precision / scale 범위 조정
15-2) Float numeric 가변 길이 저장 방식 적용 (원복)15-3) loaddb 유틸리티 수정
16. e77e0cd : 이슈 수정 (5건)
16-1) round() 함수의 특정 케이스에서 발생하던 overflow 문제를 해결합니다.
16-2) cast() 함수에서 double 지수 표현을 numeric 타입으로 변환할 수 있는 범위를 확장합니다.
16-3) 산술 연산 결과에 대한 overflow 처리 로직을 추가합니다.
16-4) 복합 인덱스 key 생성 및 조회 과정에서 발생하던 core dump 문제를 해결합니다.
mr_index_lengthval_numeric(),mr_index_lengthmem_numeric()함수를 잘못 수정하여, 322c7ed 커밋에서 원복 후 다른 방법으로 수정함.16-5) 나눗셈 연산 결과가 40자리를 초과하는 경우 적용되는 반올림 로직을 수정합니다.
17. 322c7ed : precision, scale 값을 얻는 중복 코드를 공통 함수로 분리
mr_index_lengthval_numeric(),mr_index_lengthmem_numeric()함수를 잘못 수정하여 원복한 뒤, 다른 방법으로 재수정함.18. 66a9c30 : numeric 처리 정확도 개선 및 server–pl_server 동작 정합성 수정
18-1) (server) numeric 오버플로우 및 반올림 처리를 위해, server의 기존 정수/실수 리터럴 값에 +1을 추가함.
18-2) (server) numeric 파싱 과정에서 다음 로직을 추가함.
18-3) (server) 나눗셈 연산 시 mantissa 계산 방식 수정
-- result : 9.999999999999999999999999999999999999990 (40,39)18-4) (pl_server) BigDecimal의 precision/scale을 중복으로 검사하고 scale을 보정하던 로직을 공통 함수로 통합함.
18-5) (pl_server) TypeNumeric의 key 값이 유니크하도록 수정함.
18-6) (pl_server) 비교 연산 시 트레일링 제로로 인해 동일한 값이 다르게 비교되던 문제를 수정함.
18-7) (pl_server) 나눗셈 연산 결과가 server와 다르게 출력되던 문제를 수정함
19. 43a6eaf : mod() 함수 버그 수정
19-1)
mod(m, n)함수 수행 시 n의 값이 0인 경우, m의 값을 그대로 반환해야 하나, m이 실수인 경우db_value->domain의precision/scale값을 잘못 읽어NULL이 반환되던 문제를 수정함.19-2) float numeric 저장 방식을 가변 길이로 변경한 이후,unload/loaddb 유틸리티가 정상적으로 동작하지 않던 문제를 수정함. (원복)20. 5e0a051 : float numeric 가변 길이 저장 방식 원복
PR_TYPE tp_Numeric 전역 구조체에서varp_arg값이 고정 길이 기준으로 사용되고 있어,mr_data_*mem/val관련 함수 수정만으로는 float numeric 타입에 가변 길이 저장 방식을 적용할 수 없음.mr_data_*mem/val이외의 코드 영역에도 불필요한 조건 분기가 추가되어 성능 저하 및 가독성 저하가 발생함.ALTER구문을 통해 컬럼 타입을 다른 타입으로 변경하는 과정에서 기존 데이터를 정상적으로 읽지 못해NULL이 반환되는 문제가 확인됨.21. e64c268 : tp_Numeric(DB_TYPE_NUMERIC) 저장 구조를 가변 길이 방식으로 변경
22. 4302554 : ELT() 내장 함수 수행 로직에서 불필요한 함수 호출을 줄이도록 수정함.
23. 811c671 : 코드 리뷰 내용 반영 및 loaddb SA 모드 버그 수정
23-1) loaddb SA 모드에서 발생하던 core dump 문제 수정
PR_TYPE tp_Numeric의4번째 인자(size_arg)를 최소값으로 설정한 경우, SA 모드에서 loaddb 수행 시 메모리 크기 계산이 맞지 않아 core dump가 발생하던 문제를 수정함.23-2) 코드 리뷰 내용 반영
db_value->domain의precision == 40 && scale == 0으로 확인하던 로직을precision == 40만으로 판별하도록 변경함.precision > 38인 경우 float numeric으로 변환하도록 수정precision == 40인 경우에만float numeric으로 인식했으나,precision == 39처럼 경계에 있는 값이fixed numeric으로 처리되면서 불필요한 분기 로직이 수행되는 문제가 있었음.precision > 38조건으로 수정하여, 불필요한 분기 수행 문제를 해소함.24. 36049f4 : 특정 산술 연산(+, -, *) 케이스에서
cub_server와PL/CSQL의 결과가 서로 달라지는 문제 수정PL/CSQL쪽에서 연산 전에 자릿수(precision/scale)를 계산한 뒤, 연산 과정에서 자릿수를 제한하고 반올림을 수행한 다음, 결과를 다시 최대precision/scale범위에 맞게 재조정(반올림 포함)하기 때문입니다.25. ddcae74, 0cf248e : TO_NUMBER() 결과 불일치 수정, 반환 도메인 FLOAT NUMERIC 적용
26. 3f04ec1, 90ee8d4, e8a0df9 : CTP(SQL) 수행 중 의도하지 않은 결과가 발생하거나 core dump가 발생하는 문제를 수정함
26-1) 기존 연산 함수(
numeric_db_value_add/sub/mul/div)의 반환 타입을 항상Float Numeric으로 처리하도록 수정fixed numeric전용으로 가정하고 있었으나, float numeric 도입 이후 NUMERIC 값이 한 번이라도 가공(연산/내장 함수 등)되면Float Numeric으로 처리하는 신규 룰에 맞춰 동작을 일관화함26-2)
serial/auto_increment관련연산(nextval 등)에서 결과가Float Numeric으로 반환되 발생하는 문제 수정serial및auto_increment는 항상fixed numeric으로 관리되어야 함nextval등의 연산 결과가Float Numeric으로 나오게 되어, 저장 및 후속 처리를 위해fixed numeric으로 재변환하도록 수정함26-3)SUM(),AVG()처리 시 인자가numeric인 경우domain결정 로직 보완-SUM(),AVG()수행 전 DOMAIN 이numeric인 경우 내부적으로 별도cast가 수행되지 않아domain설정이 부정확할 수 있었음-float/fixed numeric을 구분해 올바른domain이 설정되도록 수정함-GROUP BY와 함께 사용할 경우DOMAIN정보가 덮어씌어지는 문제도 함께 수정함26-4)
NUMERIC음수 변환 함수 호출이 실수로 제거된 부분 다시 추가함precision/scale 값을 얻는 중복 코드를 공통 함수로 분리하는 과정에서 해당 호출이 제거된 것을 확인하여 원복함26-5)
view 테이블에서numeric(0)사용 시size ovf로core발생하는 문제 해결함_gv_numeric_precision_to_bytes_lookup배열을 1개 확장하여, precision이 0인 경우 0을 반환하도록 수정함26-6)
GROUP BY절에서LAST_INSERT_ID()함수를 사용할 때 의도와 다른 결과가 출력되는 문제를 수정함26-7)
mr_data_*mem_numeric관련 NULL 처리 오류 수정mr_data_*mem_numeric함수의 NULL 처리 방식을varchar 타입과 동일하게 수정함.fixed numeric컬럼에NULL값을 저장한 후 조회 시, 실제 값이 NULL임에도 불구하고0으로 반환되던 문제를 수정함.26-8) SUM, AVG 함수 오류 수정
e8a0df9커밋에서 수정함.26-9) numeric
precision–byte변환LUT공식 수정precision이7,12등의 값인 경우,최상위 바이트의최상위 비트(MSB)가부호 비트가 아닌값 비트로 채워져 잘못된 결과가 반환되는 문제가 발생함.최상위 바이트의최상위 비트가값으로 사용되는 precision의 경우, 부호 비트 확보를 위해1바이트를 추가로 할당하도록 보정함.27-10)
JOIN + START WITH ... CONNECT BY수행 시 결과 불일치 문제 수정JOIN 수행 결과에 대해 테이블 컬럼의domain(numeric(10,2))기준으로hash key가 생성됨.START WITH ... CONNECT BY구문 수행 시, probe_regu_list의domain이 numeric(40,0) (float numeric)으로 변경됨.START WITH 절의int 값이numeric(10,2)가 아닌float numeric기준으로 cast되며,예를 들어 1 → 1.00 (100)형태로 변환되지 않아hash key불일치가 발생함.hash key를 생성한numeric domain이fixed numeric(precision/scale 보유)인 경우,float numeric도메인 정보를fixed numeric domain으로 재설정(cast)하도록 수정함.hash key생성이 의도한 결과 처럼 생성되어 문제를 해결함.