Files
email-tracker/external/duckdb/tools/juliapkg/test/test_replacement_scan.jl
2025-10-24 19:21:19 -05:00

73 lines
2.1 KiB
Julia

# test_replacement_scan.jl
function RangeReplacementScan(info)
table_name = DuckDB.get_table_name(info)
number = tryparse(Int64, table_name)
if number === nothing
return
end
DuckDB.set_function_name(info, "range")
DuckDB.add_function_parameter(info, DuckDB.create_value(number))
return
end
@testset "Test replacement scans" begin
con = DBInterface.connect(DuckDB.DB)
# add a replacement scan that turns any number provided as a table name into range(X)
DuckDB.add_replacement_scan!(con, RangeReplacementScan, nothing)
df = DataFrame(DBInterface.execute(con, "SELECT * FROM \"2\" tbl(a)"))
@test df.a == [0, 1]
# this still fails
@test_throws DuckDB.QueryException DBInterface.execute(con, "SELECT * FROM nonexistant")
DBInterface.close!(con)
end
function RepeatReplacementScan(info)
table_name = DuckDB.get_table_name(info)
splits = split(table_name, "*")
if size(splits, 1) != 2
return
end
number = tryparse(Int64, splits[2])
if number === nothing
return
end
DuckDB.set_function_name(info, "repeat")
DuckDB.add_function_parameter(info, DuckDB.create_value(splits[1]))
DuckDB.add_function_parameter(info, DuckDB.create_value(number))
return
end
@testset "Test string replacement scans" begin
con = DBInterface.connect(DuckDB.DB)
# add a replacement scan that turns any number provided as a table name into range(X)
DuckDB.add_replacement_scan!(con, RepeatReplacementScan, nothing)
df = DataFrame(DBInterface.execute(con, "SELECT * FROM \"hello*2\" tbl(a)"))
@test df.a == ["hello", "hello"]
# this still fails
@test_throws DuckDB.QueryException DBInterface.execute(con, "SELECT * FROM nonexistant")
DBInterface.close!(con)
end
function ErrorReplacementScan(info)
throw("replacement scan eek")
end
@testset "Test error replacement scans" begin
con = DBInterface.connect(DuckDB.DB)
DuckDB.add_replacement_scan!(con, ErrorReplacementScan, nothing)
@test_throws DuckDB.QueryException DBInterface.execute(con, "SELECT * FROM nonexistant")
DBInterface.close!(con)
end