fix: handle oracle plsql statement ranges
Co-authored-by: staff <staff@qimaos-MacBook-Pro.local>
This commit is contained in:
1 parent
b5f40b0fd7
commit
a224a6747c
5 files changed
+325
-2
No files matched your search
@@ -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!(
|
||||
|
||||
Reference in new issue
Block a user