From e964c6eb2b95f692875ae344374bc99c99013120 Mon Sep 17 00:00:00 2001 From: IamSanjid Date: Wed, 23 Oct 2024 02:50:55 +0600 Subject: Reuse field for binding --- sqlite.zig | 48 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) (limited to 'sqlite.zig') diff --git a/sqlite.zig b/sqlite.zig index 4d7457b..62950c8 100644 --- a/sqlite.zig +++ b/sqlite.zig @@ -2069,11 +2069,26 @@ pub fn Statement(comptime opts: StatementOptions, comptime query: anytype) type const StructTypeInfo = @typeInfo(StructType).@"struct"; - if (comptime query.bind_markers.len != StructTypeInfo.fields.len) { - @compileError(std.fmt.comptimePrint("expected {d} bind parameters but got {d}", .{ - query.bind_markers.len, - StructTypeInfo.fields.len, - })); + comptime marker_len_check: { + if (query.bind_markers.len != StructTypeInfo.fields.len) { + if (query.bind_markers.len > StructTypeInfo.fields.len) { + var found_markers = 0; + for (query.bind_markers) |bind_marker| { + if (bind_marker.name) |name| { + if (@hasField(StructType, name)) { + found_markers += 1; + } + } + } + if (found_markers == query.bind_markers.len) { + break :marker_len_check; + } + } + @compileError(std.fmt.comptimePrint("expected {d} bind parameters but got {d}", .{ + query.bind_markers.len, + StructTypeInfo.fields.len, + })); + } } inline for (StructTypeInfo.fields, 0..) |struct_field, _i| { @@ -4021,3 +4036,26 @@ test "tagged union" { try testing.expectEqual(foobar.age, result.?.value); } } + +test "reuse same field twice in query string" { + var db = try getTestDb(); + defer db.deinit(); + try addTestData(&db); + + const update_name = "NewUpdatedName"; + + const update_name_query = "UPDATE user SET id = $id, name = $name WHERE id = $id"; + try db.exec(update_name_query, .{}, .{ .id = 20, .name = update_name }); + + const fetch_name_query = "SELECT name FROM user WHERE id = $id"; + const name = try db.oneAlloc( + []const u8, + testing.allocator, + fetch_name_query, + .{}, + .{ .id = 20 }, + ); + try testing.expect(name != null); + defer testing.allocator.free(name.?); + try testing.expectEqualStrings(name.?, update_name); +} -- cgit v1.2.3