← 목록
기타 2026-07-10 4KB 읽기 4분

SQL 고수준 키워드 바인딩 보완 + 실동작 왕복 검증

개요

한선씨 커버리지 감사에서 발견된 "고수준 SQL WHERE/SELECT/UPDATE 키워드 미바인딩" 갭을 해소. VM(crownyc.c)에는 구현이 있으나 고수준 컴파일러(hanseonc_high.c) 키워드테이블에 이름이 없어 호출 불가했던 opcode 693(SQL_SELECT)/694(SQL_WHERE)/ 695(SQL_UPDATE) 3건을 바인딩하고, 실제 CREATE→INSERT→WHERE→SELECT→COUNT→AVG→ UPDATE→JOIN 파이프라인을 왕복 실행해 기대치와 대조 검증했다.

무엇을 했는지

  1. hanseonc_high.c 키워드 3건 추가: SQL선택(693, 아리티3), SQL조건(694,
아리티4), SQL갱신(695, 아리티4). 기존 450~459는 이미 바인딩되어 있어 손대지 않음.
  1. hanseonc_rpn.c 키워드 13건 추가: 450~459(SQL계 전체, RPN 쪽엔 전무했음) +
693~695. 이유: 693/694 등은 스택에 2값(addr,count)을 반환하는데, 고수준 변수 x = f(...) 단일대입으로 소비하면 콜프레임이 오염되어 런타임 에러가 남 (기존 정규매치(692)와 동일 문제, 이미 문서화된 전례를 따름). RPN 모드의 →변수1 →변수2 순차소비만 안전하게 두 값을 받을 수 있어, 완전한 왕복 데모는 RPN으로 작성.
  1. 실동작 왕복 데모 (/tmp/cov_sandbox/sql/): 단일컬럼 테이블 생성 → 5행 삽입
(10,20,30,40,50) → WHERE(=30) → SELECT(전체) → COUNT(=30) → AVG → UPDATE(전체 999로 덮어쓰기) → AVG 재확인. 모두 기대치와 일치(rowcount=5, WHERE=1건, SELECT=5건, COUNT=1, AVG=30000→999000). 2테이블 JOIN(단일컬럼 등가키)도 별도 RPN 데모로 검증, 2건 매치 확인.
  1. 한계 실측 및 문서화:
- 비교연산자는 등가(=)만 지원, </> 등 없음(소스 확인). - JOIN은 inner-only 등가조인, O(n·m). - UPDATE는 조건 없이 전체 행 무조건 덮어쓰기 — WHERE와 결합한 조건부 갱신 불가(별도 재구현 필요). - 문자열 컬럼 사실상 미지원 — SQL계 opcode는 cube_to_int() 원시 핸들 비교만 하고, 한선씨 문자열은 인터닝되지 않아 동일 리터럴도 다른 핸들을 받을 수 있음. 실측: 문자열 3행 삽입 후 SQL개수(=존재하는 값) = 0. - SQL_SELECT(693) VM 자체에 스택 누수 버그 발견 — case 693이 매 반복마다 push()한 원본 행 값을 정리하지 않고 방치. 반환된 결과수 자체는 정확하지만 스택에 n개 값이 잔류. crownyc.c(VM 코어) 수정은 이번 작업 범위를 벗어나 버그로만 기록, 고치지 않음.
  1. 빌드/배포: hanseonc_high.c/hanseonc_rpn.c만 변경(VM crownyc.c는 무변경).
정본 바이너리 mv 교체(hanseonc_high, hanseonc_rpn) + pkg/hanseonc_high.c 동기화 + pkg 바이너리 재빌드(mv). tests/run_all.sh 스왑 전/후 모두 99/107 통과(변동 없음).

관련 파일

  • /Users/ef/CrownyOS/crownyc/hanseonc_high.c — 키워드테이블(693~695 신규)
  • /Users/ef/CrownyOS/crownyc/hanseonc_rpn.c — 키워드테이블(450~459, 693~695 신규)
  • /Users/ef/CrownyOS/crownyc/pkg/hanseonc_high.c — 동기화본
  • /Users/ef/CrownyOS/crownyc/docs/한선씨-P2보완-20260710/SQL검증.md — 상세 검증 로그
  • /tmp/cov_sandbox/sql/*.한선 — 왕복 데모 소스(roundtrip.한선, sql_rpn.rpn.한선,
sql_join_rpn.rpn.한선, sql_string_test.한선, str_eq_check.한선)

잔여 이슈

  • crownyc.c case 693(SQL_SELECT) 스택 누수 버그 — 후속 수정 과제로 남김.
  • 다중 컬럼(레코드 기반) SQL_INSERT(450) 조합 왕복은 검증 범위 밖(단일 스칼라
컬럼만 검증) — 필요 시 후속 확인.
  • 조건부 UPDATE(WHERE+UPDATE 결합)는 현재 opcode 조합으로 직접 지원 안 됨 —
필요하면 WHERE 결과 인덱스 기반 수동 재작성 로직을 별도 라이브러리로 구현해야 함.