fix #565: read ORDS vector body stream once
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user