diff --git a/src/spanner/adapter.ts b/src/spanner/adapter.ts index 4a079d5..16910d6 100644 --- a/src/spanner/adapter.ts +++ b/src/spanner/adapter.ts @@ -249,12 +249,15 @@ function generateTypeHintsFromParams(params?: Record): Record = {}; + let hasKeys = false; for (const key in params) { if (Object.prototype.hasOwnProperty.call(params, key)) { typeHints[key] = inferSpannerTypeFromValue(params[key]); + hasKeys = true; } } - return typeHints; + // Return undefined if params is empty to avoid sending empty types object to Spanner + return hasKeys ? typeHints : undefined; } // Helper function to merge provided hints with inferred hints diff --git a/test/spanner/adapter-type-hints.test.ts b/test/spanner/adapter-type-hints.test.ts index 60baa98..4827786 100644 --- a/test/spanner/adapter-type-hints.test.ts +++ b/test/spanner/adapter-type-hints.test.ts @@ -167,12 +167,15 @@ class TestableSpannerAdapter { if (!params) return undefined; const typeHints: Record = {}; + let hasKeys = false; for (const key in params) { if (Object.prototype.hasOwnProperty.call(params, key)) { typeHints[key] = this.inferSpannerTypeFromValue(params[key]); + hasKeys = true; } } - return typeHints; + // Return undefined if params is empty to avoid sending empty types object to Spanner + return hasKeys ? typeHints : undefined; } // Helper function to merge provided hints with inferred hints @@ -673,6 +676,17 @@ describe("SpannerAdapter Type Hints", () => { }); describe("Automatic Type Inference", () => { + it("should handle queries without parameters correctly", async () => { + // No parameters at all + const result1 = await adapter.query("SELECT * FROM test"); + // Mock returns "no_types" when no types are passed + expect(result1).toEqual([{ result: "no_types" }]); + + // Empty parameters object + const result2 = await adapter.query("SELECT * FROM test", {}); + expect(result2).toEqual([{ result: "no_types" }]); + }); + it("should automatically infer types when no hints provided", async () => { const params = { stringParam: "test",