fix: handle oracle plsql statement ranges

Co-authored-by: staff <staff@qimaos-MacBook-Pro.local>
This commit is contained in:
zipgandstaff authored and GitHub committed 2026-07-01 12:26:03 +08:00
1 parent b5f40b0fd7
commit a224a6747c
5 files changed
+325 -2

No files matched your search

+51
View File
@@ -2594,6 +2594,57 @@ SELECT 1;";
assert_eq!(find_statement_at_cursor_for_database(sql, next_cursor, DatabaseType::Oracle), "SELECT 1");
}
#[test]
fn oracle_like_current_statement_keeps_nested_dml_plsql_block_together() {
let sql = "\
DECLARE
v_order_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_order_count
FROM \"DBX_TEST\".\"ORDERS_10K\";
IF v_order_count = 0 THEN
INSERT INTO \"DBX_TEST\".\"STORES\"
(\"ID\", \"STORE_CODE\", \"STORE_NAME\", \"CITY\", \"OPENED_AT\")
SELECT 10001, 'TEST_STORE_001', '测试门店', '上海', SYSDATE
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM \"DBX_TEST\".\"STORES\" WHERE \"ID\" = 10001
);
INSERT INTO \"DBX_TEST\".\"PRODUCTS\"
(\"ID\", \"SKU\", \"PRODUCT_NAME\", \"CATEGORY\", \"PRICE\")
SELECT 10001, 'TEST_SKU_001', '测试商品', '测试分类', 99.90
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM \"DBX_TEST\".\"PRODUCTS\" WHERE \"ID\" = 10001
);
INSERT INTO \"DBX_TEST\".\"ORDERS_10K\"
(\"ID\", \"ORDER_NO\", \"STORE_ID\", \"PRODUCT_ID\", \"CUSTOMER_NAME\", \"QUANTITY\", \"AMOUNT\", \"ORDER_STATUS\", \"CREATED_AT\")
SELECT 10001, 'TEST_ORDER_001', 10001, 10001, '测试客户', 2, 199.80, 'PAID', SYSDATE
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM \"DBX_TEST\".\"ORDERS_10K\" WHERE \"ORDER_NO\" = 'TEST_ORDER_001'
);
COMMIT;
END IF;
END;
/
SELECT 1;";
let expected = sql.split("\n/").next().unwrap();
let cursor = sql[..sql.find("ORDERS_10K").unwrap()].encode_utf16().count();
let next_cursor = sql[..sql.find("SELECT 1;").unwrap()].encode_utf16().count();
assert_eq!(
split_sql_statements_for_database(sql, DatabaseType::Oracle),
vec![expected.to_string(), "SELECT 1".to_string()]
);
assert_eq!(find_statement_at_cursor_for_database(sql, cursor, DatabaseType::Oracle), expected);
assert_eq!(find_statement_at_cursor_for_database(sql, next_cursor, DatabaseType::Oracle), "SELECT 1");
}
#[test]
fn oracle_like_split_keeps_transaction_begin_as_statement() {
assert_eq!(