diff --git a/packages/server/src/integrations/mysql.ts b/packages/server/src/integrations/mysql.ts index 69dbb40480..acf8f4904a 100644 --- a/packages/server/src/integrations/mysql.ts +++ b/packages/server/src/integrations/mysql.ts @@ -106,7 +106,11 @@ function bindingTypeCoerce(bindings: any[]) { } // if not a number, see if it is a date - important to do in this order as any // integer will be considered a valid date - else if (/^\d/.test(binding) && dayjs(binding).isValid()) { + else if ( + /^\d/.test(binding) && + dayjs(binding).isValid() && + !binding.includes(",") + ) { bindings[i] = dayjs(binding).toDate() } } diff --git a/packages/server/src/integrations/tests/mysql.spec.ts b/packages/server/src/integrations/tests/mysql.spec.ts index a70eb73857..c4a26beb60 100644 --- a/packages/server/src/integrations/tests/mysql.spec.ts +++ b/packages/server/src/integrations/tests/mysql.spec.ts @@ -73,4 +73,61 @@ describe("MySQL Integration", () => { expect(response).toEqual([{ deleted: true }]) }) }) + + describe("binding type coerce", () => { + it("ignores non-string types ", async () => { + const sql = "select * from users;" + const date = new Date() + await config.integration.read({ + sql, + bindings: [11, date, ["a", "b", "c"], { id: 1 }], + }) + expect(config.integration.client.query).toHaveBeenCalledWith(sql, [ + 11, + date, + ["a", "b", "c"], + { id: 1 }, + ]) + }) + + it("parses strings matching a number regex", async () => { + const sql = "select * from users;" + await config.integration.read({ + sql, + bindings: ["101", "3.14"], + }) + expect(config.integration.client.query).toHaveBeenCalledWith( + sql, + [101, 3.14] + ) + }) + + it("parses strings matching a valid date format", async () => { + const sql = "select * from users;" + await config.integration.read({ + sql, + bindings: [ + "2001-10-30", + "2010-09-01T13:30:59.123Z", + "2021-02-05 12:01 PM", + ], + }) + expect(config.integration.client.query).toHaveBeenCalledWith(sql, [ + new Date("2001-10-30T00:00:00.000Z"), + new Date("2010-09-01T13:30:59.123Z"), + new Date("2021-02-05T12:01:00.000Z"), + ]) + }) + + it("does not parse string matching a valid array of numbers as date", async () => { + const sql = "select * from users;" + await config.integration.read({ + sql, + bindings: ["1,2,2017"], + }) + expect(config.integration.client.query).toHaveBeenCalledWith(sql, [ + "1,2,2017", + ]) + }) + }) })