fix #565: read ORDS vector body stream once

This commit is contained in:
devmrko
2026-06-29 20:20:59 +09:00
parent 4ba6a57835
commit b674d301db
2 changed files with 20 additions and 2 deletions

View File

@@ -48,19 +48,24 @@ BEGIN
p_source => q'! p_source => q'!
DECLARE DECLARE
v_rows SYS_REFCURSOR; v_rows SYS_REFCURSOR;
v_body_text CLOB;
v_embedding_text VARCHAR2(32767); v_embedding_text VARCHAR2(32767);
BEGIN BEGIN
cb_ords_handler_pkg.set_vpd_context(:auth_header); cb_ords_handler_pkg.set_vpd_context(:auth_header);
-- ORDS exposes :body_text as a stream bind. Read it exactly once; referring
-- to the stream bind twice causes ORA-17270 (Duplicate stream parameter).
v_body_text := :body_text;
-- JSON_QUERY accepts a numeric JSON array. The JSON_VALUE fallback also -- JSON_QUERY accepts a numeric JSON array. The JSON_VALUE fallback also
-- permits clients that send the vector as the text "[0.1,0.2,...]". -- permits clients that send the vector as the text "[0.1,0.2,...]".
v_embedding_text := JSON_QUERY( v_embedding_text := JSON_QUERY(
:body_text, v_body_text,
'$.embedding' RETURNING VARCHAR2(32767) '$.embedding' RETURNING VARCHAR2(32767)
); );
IF v_embedding_text IS NULL THEN IF v_embedding_text IS NULL THEN
v_embedding_text := JSON_VALUE( v_embedding_text := JSON_VALUE(
:body_text, v_body_text,
'$.embedding' RETURNING VARCHAR2(32767) '$.embedding' RETURNING VARCHAR2(32767)
); );
END IF; END IF;

View File

@@ -126,6 +126,19 @@ class GuidedFlowTemplateTest {
.contains("검색 기술 상세 보기"); .contains("검색 기술 상세 보기");
} }
@Test
void vectorOrdsHandlerReadsBodyStreamOnlyOnce() throws IOException {
String sql = Files.readString(Path.of("sql/adb/29_agent_ords_vector_search_ords.sql"));
assertThat(sql)
.contains("v_body_text CLOB")
.contains("v_body_text := :body_text")
.contains("Duplicate stream parameter")
.doesNotContain("JSON_QUERY(\n :body_text")
.doesNotContain("JSON_VALUE(\n :body_text");
assertThat(sql.split("v_body_text := :body_text", -1)).hasSize(2);
}
private String template(String relativePath) throws IOException { private String template(String relativePath) throws IOException {
return Files.readString(Path.of("src/main/resources/templates").resolve(relativePath)); return Files.readString(Path.of("src/main/resources/templates").resolve(relativePath));
} }