현상
Tibero에서 DBLINK를 통해 PostgreSQL에 접속하여 쿼리를 수행할 때 아래와 같은 오류가 발생합니다.
•
TBR-12126: Remote database client API error - Explicit prepare failed. - ERROR: column qb_002.ID does not exist Position: 8
•
TBR-130097:Explicit prepare failed. - ERROR: column qb_002.ID does not exist Position: 8
컬럼명이 쌍따옴표(" ")로 감싸지 않은 경우, Tibero와 PostgreSQL 간의 대소문자 처리 규칙 차이로 인해 "c1"과 C1 같은 식별자가 구분되지 않습니다. 이로 인해 DBLINK 파싱 과정에서 컬럼명이 정확히 일치하지 않아 오류가 발생하였습니다.
재현
테이블 생성문
postgres>
CREATE TABLE "t3" (B1 INT);
SQL
복사
데이터 INSERT
postgres>
INSERT INTO "t3" (B1) VALUES (10);
INSERT INTO "t3" (B1) VALUES (20);
INSERT INTO "t3" (B1) VALUES (30);
SQL
복사
조회
tbsql>
SELECT * FROM "t3"@PG;
→ 에러발생
TBR-12126: Remote database client API error - Explicit prepare failed. - ERROR: column qb_002.ID does not exist Position: 8
TBR-130097:Explicit prepare failed. - ERROR: column qb_002.ID does not exist Position: 8
SQL
복사
원인
Tibero와 PostgreSQL 간의 기본 대소문자 처리 방식이 상이한 점이 문제의 원인입니다.
PostgreSQL에서는 기본적으로 식별자를 소문자로 인식하기 때문에, 예를 들어 TABLE t3의 컬럼 B1은 소문자로 인식됩니다. 반면, Tibero는 기본적으로 대문자로 인식하여 같은 컬럼명을 대문자로 해석합니다.
이로 인해 tbsql이 SQL 쿼리를 변환할 때 식별자에 대한 대소문자 규칙의 차이로 인해, DBLINK 파싱 과정에서 문자인식에 대한 오류가 있어 문제가 발생하였습니다.
Tibero 의 대소문자 규칙
설명 | 예시 |
Double quotes(" ") 없이 사용할 경우 | Tibero는 테이블과 칼럼 이름을 모두 '대문자'로 인식 |
큰따옴표가 없는 식별자를 대문로 처리 | CREATE TABLE t2 (C1 INT); → 테이블 이름 T2, 컬럼 이름 C1 |
큰따옴표 사용 시 글자 그대로 보존 | 예: CREATE TABLE "t2" ("C1" INT); → 테이블 이름 "t2", 컬럼 이름 "C1". |
Postgresql의 대소문자 규칙
설명 | 예 |
Double quotes(" ") 없이 사용할 경우 | Postgresql은 테이블과 칼럼 이름을 모두 ‘소문자’로 변경 |
큰따옴표가 없는 식별자를 소문자로 처리 | CREATE TABLE t2 (C1 INT); → 테이블 이름 t2, 컬럼 이름 c1 |
큰따옴표가 없는 식별자를 소문자로 처리 | 예: CREATE TABLE "t2" ("C1" INT); → 테이블 이름 "t2", 컬럼 이름 "C1". |
해결
일관된 대소문자 표준을 위해 " "(double quote)를 사용하여 문자 그대로 보존함으로써 문제를 해결합니다.
쿼리 작성 시 큰따옴표를 일관되게 사용하여 PostgreSQL과 Tibero 간의 대소문자 처리 규칙 차이로 인한 충돌을 방지합니다.
PostgreSQL에서 테이블 생성 시 테이블명과 컬럼명을 모두 " "로 감싸는 방식으로 일관성을 유지하여 문제를 해결합니다.