summaryrefslogtreecommitdiff
path: root/sqlite.zig
diff options
context:
space:
mode:
authorGravatar Vincent Rischmann2024-12-08 12:35:00 +0100
committerGravatar Vincent Rischmann2024-12-08 12:35:00 +0100
commit7fdaabd31db62b57ea663964a14904f558352589 (patch)
tree6bf02399af8f1d976e4e7ebc0b3eb8b5d0e7b00e /sqlite.zig
parentMerge pull request #170 from vrischmann/ci-ubuntu-2404 (diff)
parentadd a fuzz test (diff)
downloadzig-sqlite-7fdaabd31db62b57ea663964a14904f558352589.tar.gz
zig-sqlite-7fdaabd31db62b57ea663964a14904f558352589.tar.xz
zig-sqlite-7fdaabd31db62b57ea663964a14904f558352589.zip
Merge branch 'fuzzing'
Diffstat (limited to 'sqlite.zig')
-rw-r--r--sqlite.zig67
1 files changed, 67 insertions, 0 deletions
diff --git a/sqlite.zig b/sqlite.zig
index 6174d1c..6d22d1f 100644
--- a/sqlite.zig
+++ b/sqlite.zig
@@ -4068,3 +4068,70 @@ test "reuse same field twice in query string" {
4068 defer testing.allocator.free(name.?); 4068 defer testing.allocator.free(name.?);
4069 try testing.expectEqualStrings(name.?, update_name); 4069 try testing.expectEqualStrings(name.?, update_name);
4070} 4070}
4071
4072test "fuzzing" {
4073 const global = struct {
4074 fn testOne(input: []const u8) anyerror!void {
4075 var db = try Db.init(.{
4076 .mode = .Memory,
4077 .open_flags = .{
4078 .write = true,
4079 .create = true,
4080 },
4081 });
4082 defer db.deinit();
4083
4084 try db.exec("CREATE TABLE test(id integer primary key, name text, data blob)", .{}, .{});
4085
4086 db.execDynamic(input, .{}, .{}) catch |err| switch (err) {
4087 error.SQLiteError => return,
4088 error.ExecReturnedData => return,
4089 error.EmptyQuery => return,
4090 else => return err,
4091 };
4092
4093 db.execDynamic(
4094 "INSERT INTO test(name, data) VALUES($name, $data)",
4095 .{},
4096 .{
4097 .name = "foo",
4098 .data = input,
4099 },
4100 ) catch |err| switch (err) {
4101 error.SQLiteError => return,
4102 else => return err,
4103 };
4104
4105 var stmt = db.prepareDynamic("SELECT name, data FROM test") catch |err| switch (err) {
4106 error.SQLiteError => return,
4107 else => return err,
4108 };
4109 defer stmt.deinit();
4110
4111 var rows_memory: [4096]u8 = undefined;
4112 var rows_fba = std.heap.FixedBufferAllocator.init(&rows_memory);
4113
4114 const row_opt = stmt.oneAlloc(
4115 struct {
4116 name: Text,
4117 data: Blob,
4118 },
4119 rows_fba.allocator(),
4120 .{},
4121 .{},
4122 ) catch |err| switch (err) {
4123 error.SQLiteError => return,
4124 else => return err,
4125 };
4126
4127 if (row_opt) |row| {
4128 if (!std.mem.eql(u8, row.name.data, "foo")) return error.InvalidNameField;
4129 if (!std.mem.eql(u8, row.data.data, input)) return error.InvalidDataField;
4130 } else {
4131 return error.NoRowsFound;
4132 }
4133 }
4134 };
4135
4136 try testing.fuzz(global.testOne, .{});
4137}