diff --git a/CHANGELOG.md b/CHANGELOG.md index 389873e..f61493f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.0 + +- Quote column names to prevent SQL syntax errors + ## 1.1.1 - Fix issue with built package of v1.1.0 diff --git a/package.json b/package.json index bb17615..43f9dd9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "data-bakery", - "version": "1.1.1", + "version": "1.2.0", "description": "A tool to prepare test SQL data for integration tests", "main": "./src/recipe-helper.js", "scripts": { diff --git a/src/utils/sql-generator.ts b/src/utils/sql-generator.ts index b25746f..a75cead 100644 --- a/src/utils/sql-generator.ts +++ b/src/utils/sql-generator.ts @@ -33,7 +33,10 @@ export function sqlForRecipeBundle (recipeBundle: RecipeBundle, config: SQLGener return `(${newValueList.join(', ')})` }) - sqlQueries.push(`INSERT INTO \`${tableName}\` (${columnMapKey}) VALUES ${valueLists.join(', ')};`) + const rawColumnNames = columnMapKey.split(',') + const quotedColumnNames = '`' + rawColumnNames.join('`, `') + '`' + + sqlQueries.push(`INSERT INTO \`${tableName}\` (${quotedColumnNames}) VALUES ${valueLists.join(', ')};`) }) }) }) diff --git a/tests/snapshot/package.json b/tests/snapshot/package.json index 1cd5e68..9216636 100644 --- a/tests/snapshot/package.json +++ b/tests/snapshot/package.json @@ -2,6 +2,6 @@ "name": "data-bakery-snapshot-tests", "version": "1.0.0", "dependencies": { - "data-bakery": "file:../../data-bakery-1.1.1.tgz" + "data-bakery": "file:../../data-bakery-1.2.0.tgz" } } diff --git a/tests/snapshot/tests/async-recipe/expected-output/10-user1.sql b/tests/snapshot/tests/async-recipe/expected-output/10-user1.sql index 44f2efb..16e2230 100644 --- a/tests/snapshot/tests/async-recipe/expected-output/10-user1.sql +++ b/tests/snapshot/tests/async-recipe/expected-output/10-user1.sql @@ -1 +1 @@ -INSERT INTO `user` (id,email) VALUES (1, 'hello@world.com'); +INSERT INTO `user` (`id`, `email`) VALUES (1, 'hello@world.com'); diff --git a/tests/snapshot/tests/async-recipe/expected-output/11-user2.sql b/tests/snapshot/tests/async-recipe/expected-output/11-user2.sql index d776a70..4ce8e10 100644 --- a/tests/snapshot/tests/async-recipe/expected-output/11-user2.sql +++ b/tests/snapshot/tests/async-recipe/expected-output/11-user2.sql @@ -1 +1 @@ -INSERT INTO `user` (id,email) VALUES (2, 'another-hello@world.com'); +INSERT INTO `user` (`id`, `email`) VALUES (2, 'another-hello@world.com'); diff --git a/tests/snapshot/tests/databakeryignore/actual-output/00-schema.sql b/tests/snapshot/tests/databakeryignore/actual-output/00-schema.sql index df605c0..62a4845 100644 --- a/tests/snapshot/tests/databakeryignore/actual-output/00-schema.sql +++ b/tests/snapshot/tests/databakeryignore/actual-output/00-schema.sql @@ -1,16 +1,16 @@ -CREATE DATABASE IF NOT EXISTS data_bakery_test; -USE data_bakery_test; +CREATE DATABASE IF NOT EXISTS `data_bakery_test`; +USE `data_bakery_test`; -DROP TABLE IF EXISTS users; -CREATE TABLE users ( - id INT AUTO_INCREMENT PRIMARY KEY, - firstName VARCHAR(255), - email VARCHAR(255) +DROP TABLE IF EXISTS `users`; +CREATE TABLE `users` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `firstName` VARCHAR(255), + `email` VARCHAR(255) ); -DROP TABLE IF EXISTS orders; -CREATE TABLE orders ( - id INT AUTO_INCREMENT PRIMARY KEY, - userId INT, - amount INT +DROP TABLE IF EXISTS `orders`; +CREATE TABLE `orders` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `userId` INT, + `amount` INT ); diff --git a/tests/snapshot/tests/databakeryignore/expected-output/00-schema.sql b/tests/snapshot/tests/databakeryignore/expected-output/00-schema.sql index df605c0..62a4845 100644 --- a/tests/snapshot/tests/databakeryignore/expected-output/00-schema.sql +++ b/tests/snapshot/tests/databakeryignore/expected-output/00-schema.sql @@ -1,16 +1,16 @@ -CREATE DATABASE IF NOT EXISTS data_bakery_test; -USE data_bakery_test; +CREATE DATABASE IF NOT EXISTS `data_bakery_test`; +USE `data_bakery_test`; -DROP TABLE IF EXISTS users; -CREATE TABLE users ( - id INT AUTO_INCREMENT PRIMARY KEY, - firstName VARCHAR(255), - email VARCHAR(255) +DROP TABLE IF EXISTS `users`; +CREATE TABLE `users` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `firstName` VARCHAR(255), + `email` VARCHAR(255) ); -DROP TABLE IF EXISTS orders; -CREATE TABLE orders ( - id INT AUTO_INCREMENT PRIMARY KEY, - userId INT, - amount INT +DROP TABLE IF EXISTS `orders`; +CREATE TABLE `orders` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `userId` INT, + `amount` INT ); diff --git a/tests/snapshot/tests/databakeryignore/expected-output/10-basic.sql b/tests/snapshot/tests/databakeryignore/expected-output/10-basic.sql index 4d62093..83692cb 100644 --- a/tests/snapshot/tests/databakeryignore/expected-output/10-basic.sql +++ b/tests/snapshot/tests/databakeryignore/expected-output/10-basic.sql @@ -1,3 +1,3 @@ -INSERT INTO `user` (id,email,firstName) VALUES (1, 'hi@there.com', 'Eric'); -INSERT INTO `user` (id,email) VALUES (2, 'hello@world.com'); -INSERT INTO `orders` (id,userId,amount) VALUES (100, 2, 5000), (101, 2, 15000); +INSERT INTO `user` (`id`, `email`, `firstName`) VALUES (1, 'hi@there.com', 'Eric'); +INSERT INTO `user` (`id`, `email`) VALUES (2, 'hello@world.com'); +INSERT INTO `orders` (`id`, `userId`, `amount`) VALUES (100, 2, 5000), (101, 2, 15000); diff --git a/tests/snapshot/tests/manager-get-named-id/expected-output/example.sql b/tests/snapshot/tests/manager-get-named-id/expected-output/example.sql index 21df570..d053453 100644 --- a/tests/snapshot/tests/manager-get-named-id/expected-output/example.sql +++ b/tests/snapshot/tests/manager-get-named-id/expected-output/example.sql @@ -1,2 +1,2 @@ -INSERT INTO `user` (id,email) VALUES (1, 'hello@world.com'); -INSERT INTO `user_extra` (id,json) VALUES (1, '{"generatedId":"1-static-prefix"}'); +INSERT INTO `user` (`id`, `email`) VALUES (1, 'hello@world.com'); +INSERT INTO `user_extra` (`id`, `json`) VALUES (1, '{"generatedId":"1-static-prefix"}'); diff --git a/tests/snapshot/tests/object-recipe/expected-output/10-basic.sql b/tests/snapshot/tests/object-recipe/expected-output/10-basic.sql index 4d62093..83692cb 100644 --- a/tests/snapshot/tests/object-recipe/expected-output/10-basic.sql +++ b/tests/snapshot/tests/object-recipe/expected-output/10-basic.sql @@ -1,3 +1,3 @@ -INSERT INTO `user` (id,email,firstName) VALUES (1, 'hi@there.com', 'Eric'); -INSERT INTO `user` (id,email) VALUES (2, 'hello@world.com'); -INSERT INTO `orders` (id,userId,amount) VALUES (100, 2, 5000), (101, 2, 15000); +INSERT INTO `user` (`id`, `email`, `firstName`) VALUES (1, 'hi@there.com', 'Eric'); +INSERT INTO `user` (`id`, `email`) VALUES (2, 'hello@world.com'); +INSERT INTO `orders` (`id`, `userId`, `amount`) VALUES (100, 2, 5000), (101, 2, 15000); diff --git a/tests/snapshot/tests/table-defaults/expected-output/10-user1.sql b/tests/snapshot/tests/table-defaults/expected-output/10-user1.sql index e0d935a..f5c6b58 100644 --- a/tests/snapshot/tests/table-defaults/expected-output/10-user1.sql +++ b/tests/snapshot/tests/table-defaults/expected-output/10-user1.sql @@ -1 +1 @@ -INSERT INTO `user` (extra1,extra2,id,email) VALUES ('column-value-here', 9999, 450, 'hello@world.com'); +INSERT INTO `user` (`extra1`, `extra2`, `id`, `email`) VALUES ('column-value-here', 9999, 450, 'hello@world.com'); diff --git a/tests/snapshot/tests/table-defaults/expected-output/11-user2.sql b/tests/snapshot/tests/table-defaults/expected-output/11-user2.sql index d9a1f6a..dff5489 100644 --- a/tests/snapshot/tests/table-defaults/expected-output/11-user2.sql +++ b/tests/snapshot/tests/table-defaults/expected-output/11-user2.sql @@ -1 +1 @@ -INSERT INTO `user` (extra1,extra2,id,email) VALUES ('column-value-here', 9999, 451, 'another-hello@world.com'); +INSERT INTO `user` (`extra1`, `extra2`, `id`, `email`) VALUES ('column-value-here', 9999, 451, 'another-hello@world.com'); diff --git a/tests/unit/utils/sql-generator.spec.ts b/tests/unit/utils/sql-generator.spec.ts index 360599b..3ad0514 100644 --- a/tests/unit/utils/sql-generator.spec.ts +++ b/tests/unit/utils/sql-generator.spec.ts @@ -11,7 +11,7 @@ describe('sql-generator', () => { ], }) - expect(sql).toBe("INSERT INTO `user` (id,name) VALUES (1, 'Peter'), (2, 'Paul');\n") + expect(sql).toBe("INSERT INTO `user` (`id`, `name`) VALUES (1, 'Peter'), (2, 'Paul');\n") }) it('outputs batched sql up to batchSize', () => { const sql = sqlForRecipeBundle({ @@ -22,7 +22,7 @@ describe('sql-generator', () => { ], }, { batchSize: 2 }) - expect(sql).toBe("INSERT INTO `user` (id,name) VALUES (1, 'Peter'), (2, 'Paul');\nINSERT INTO `user` (id,name) VALUES (3, 'Testing');\n") + expect(sql).toBe("INSERT INTO `user` (`id`, `name`) VALUES (1, 'Peter'), (2, 'Paul');\nINSERT INTO `user` (`id`, `name`) VALUES (3, 'Testing');\n") }) it('avoids batching different column groups', () => { const sql = sqlForRecipeBundle({ @@ -32,7 +32,7 @@ describe('sql-generator', () => { ], }) - expect(sql).toBe("INSERT INTO `user` (id,name) VALUES (1, 'Peter');\nINSERT INTO `user` (id,name,extraColumn) VALUES (2, 'Paul', 'something');\n") + expect(sql).toBe("INSERT INTO `user` (`id`, `name`) VALUES (1, 'Peter');\nINSERT INTO `user` (`id`, `name`, `extraColumn`) VALUES (2, 'Paul', 'something');\n") }) it('outputs escaped sql', () => { const sql = sqlForRecipeBundle({ @@ -41,7 +41,7 @@ describe('sql-generator', () => { ], }) - expect(sql).toBe("INSERT INTO `user` (id,name,extra) VALUES (1, 'Bobby''s tables''''\\', 'It''s all \"groovy\"');\n") + expect(sql).toBe("INSERT INTO `user` (`id`, `name`, `extra`) VALUES (1, 'Bobby''s tables''''\\', 'It''s all \"groovy\"');\n") }) it('handles NULL data values', () => { const sql = sqlForRecipeBundle({ @@ -50,7 +50,7 @@ describe('sql-generator', () => { ], }) - expect(sql).toBe('INSERT INTO `user` (id,name) VALUES (1, NULL);\n') + expect(sql).toBe('INSERT INTO `user` (`id`, `name`) VALUES (1, NULL);\n') }) it('handles RawSQL values', () => { const sql = sqlForRecipeBundle({ @@ -59,7 +59,7 @@ describe('sql-generator', () => { ], }) - expect(sql).toBe('INSERT INTO `user` (id,name,created) VALUES (1, NULL, CURDATE());\n') + expect(sql).toBe('INSERT INTO `user` (`id`, `name`, `created`) VALUES (1, NULL, CURDATE());\n') }) })