검증 실행이 치환 변수를 지우던 것을 고친다 — 그 쿼리들이 통과할 수 없었다
select * from P_PATINF where PATCHTNUM = <<…bzPatientInfo.ChtNum>> → ORA-00936: 누락된 표현식 원인은 오라클이 아니라 우리 쪽이었다. 검증 실행이 <<…>> 를 전부 빈 문자열로 지운 뒤 보냈다 — "WHERE PATCHTNUM = " 가 된다. 런타임이 값 없을 때 그렇게 한다는 이유였지만(clsMDataTable.vb:67-71), 그 결과 <b>치환 변수를 값 자리에 쓴 쿼리는 검증 실행을 통과할 수가 없었다.</b> 정작 이 기능이 존재하는 이유가 그런 쿼리들이다. ## 두 갈래로 나눴다 환자를 골랐으면 <b>실제 값</b>으로 치환한다 — 구문뿐 아니라 값까지 확인된다. 안 골랐으면 빈 자리를 NULL 로 채운다. 따옴표 안이든 밖이든 문법이 성립하고 0행이 나오므로 테이블·컬럼 오타와 구문 오류는 그대로 걸린다. 자리표시는 QuerySubstitution.Apply 의 선택 인자다(기본은 레거시와 같이 빈 문자열). 실행 경로(미리보기)는 쓰지 않는다 — 거기서는 레거시와 같은 SQL 이어야 한다. 내역(Hits)에는 실제 판정을 남긴다. 자리표시로 채운 것을 "값이 있었다"로 적으면 화면이 "값이 나왔다"고 말하게 되고, 그게 이 기능에서 가장 위험한 거짓말이다. ## 환자를 세션으로 올렸다 환자는 미리보기 창에서 고르는데 검증 실행도 같은 환자로 돌아야 한다. 창마다 따로 들고 있으면 같은 서식을 두 화면에서 서로 다른 환자로 보게 되고 그건 화면으로 구분할 수 없다. PatientSession 하나만 둔다(디스크에 쓰지 않는다). ## 무엇으로 돌렸는지 말한다 요약 첫 줄이 "환자 …의 실제 값으로 실행" 또는 "환자를 고르지 않아 변수를 NULL 로 두고 구문만 검사"다. 이 줄이 없으면 0행을 보고 "이 환자에게 자료가 없다"로 잘못 읽는다. 따옴표 밖에 놓인 변수도 짚는다 — 값이 원문 그대로 박히므로(clsMDataTable.vb:113) 문자 컬럼과 비교하려면 서식 쪽에서 '<<…>>' 로 감싸야 한다. 이 배선의 가장 흔한 실수다. 질문에 딸려 온 쿼리가 정확히 그 경우였다. ## 대조군이 함정을 잡았다 '따옴표로 감싸면 경고가 없다'가 처음에 통과했는데, 경고가 <b>아예 안 떠서</b> 양쪽이 다 "없음"이었다. 원인은 내 가드다 — 토큰이 문장 끝에 오면 건너뛰게 써 놨고, WHERE 절 마지막이 가장 흔한 자리다. 경계를 '따옴표 없음'으로 보도록 고쳤다. 대조군 없이 긍정 판정만 있었으면 이 기능은 조용히 아무것도 안 하고 있었을 것이다. ## 게이트 - dotnet test 323/323 - --query-popup 실패 0 (⑨-b 5건 신규: 구문 검사가 돌고 · 자리가 비지 않고 · 근거를 밝히고 · 따옴표 밖을 짚고 · 감싸면 안 짚는다) - --edit-smoke 실패 0 · --dialog-shots FAIL 0 - --db-patient ①~⑱ 전건 통과 - --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3ef1937902
commit
8964c662f3
@@ -778,6 +778,39 @@ public static class DbSmoke
|
||||
Check("결과 표에 열이 생긴다", grid.Columns.Count >= 2, $"열 {grid.Columns.Count}개");
|
||||
Check("결과 표에 행이 채워진다", grid.Items.Count >= 1, $"행 {grid.Items.Count}개");
|
||||
|
||||
// ⑨-b 치환 변수를 값 자리에 쓴 쿼리가 검증 실행을 <b>통과할 수 있는가</b>.
|
||||
// 전에는 변수를 빈 문자열로 지워 "WHERE X = " 가 되었고 ORA-00936 이 났다 —
|
||||
// 즉 이 기능이 존재하는 이유인 쿼리들이 하나도 검사되지 못했다.
|
||||
var summary = (System.Windows.Controls.TextBlock)window.FindName("TrialSummary")!;
|
||||
Type("select * from P_PatInf"
|
||||
+ " where PatChtNum = <<M.CMM.HISOperatingInfo.bzPatientInfo.ChtNum>>");
|
||||
window.RunTrialForSmoke();
|
||||
DrainDispatcher();
|
||||
Check("⑨-b 치환 변수를 값 자리에 써도 구문 검사가 돈다",
|
||||
!summary.Text.Contains("ORA-00936", StringComparison.Ordinal),
|
||||
summary.Text);
|
||||
Check("⑨-b 변수 자리가 비지 않는다(NULL 로 채운다)",
|
||||
window.LastTrialSql.Contains("NULL", StringComparison.Ordinal)
|
||||
&& !window.LastTrialSql.TrimEnd().EndsWith("=", StringComparison.Ordinal),
|
||||
window.LastTrialSql);
|
||||
// 무엇으로 돌렸는지 말해야 한다 — 0행을 보고 "이 환자에게 자료가 없다"로 잘못 읽는다
|
||||
Check("⑨-b 무엇으로 돌렸는지 요약이 밝힌다",
|
||||
summary.Text.Contains("NULL", StringComparison.Ordinal)
|
||||
|| summary.Text.Contains("환자", StringComparison.Ordinal),
|
||||
summary.Text);
|
||||
// 따옴표 밖 변수는 이 배선의 가장 흔한 실수다 — 값이 원문 그대로 박히기 때문이다
|
||||
Check("⑨-b 따옴표 밖 변수를 짚어 준다",
|
||||
summary.Text.Contains("따옴표", StringComparison.Ordinal), summary.Text);
|
||||
|
||||
// 대조군 — 따옴표로 감싼 같은 쿼리에는 그 경고가 없어야 한다.
|
||||
// 없으면 위 판정은 "항상 경고한다"와 구분되지 않는다.
|
||||
Type("select * from P_PatInf"
|
||||
+ " where PatChtNum = '<<M.CMM.HISOperatingInfo.bzPatientInfo.ChtNum>>'");
|
||||
window.RunTrialForSmoke();
|
||||
DrainDispatcher();
|
||||
Check("⑨-b (대조군) 따옴표로 감싸면 그 경고가 없다",
|
||||
!summary.Text.Contains("따옴표", StringComparison.Ordinal), summary.Text);
|
||||
|
||||
// ⑩ 검증 실행 단축키가 실제로 배선돼 있는가.
|
||||
// 합성 키 이벤트로는 Keyboard.Modifiers 가 잡히지 않으므로(실제 키 상태를 읽는다)
|
||||
// 선언된 KeyBinding 을 찾아 그 명령을 직접 실행해 확인한다.
|
||||
|
||||
Reference in New Issue
Block a user