diff --git a/src/830into.js b/src/830into.js index 221ae3d42e..c009255a69 100755 --- a/src/830into.js +++ b/src/830into.js @@ -36,25 +36,28 @@ alasql.into.SQL = function (filename, opts, data, columns, cb) { }) .join(','); s += ') VALUES ('; - s += columns.map(function (col) { - var val = data[i][col.columnid]; - if (col.typeid) { - if ( - col.typeid === 'STRING' || - col.typeid === 'VARCHAR' || - col.typeid === 'NVARCHAR' || - col.typeid === 'CHAR' || - col.typeid === 'NCHAR' - ) { - val = "'" + escapeqq(val) + "'"; + s += columns + .map(function (col) { + var val = data[i][col.columnid]; + // Handle null and undefined values + if (val === null || val === undefined) { + return 'NULL'; } - } else { - if (typeof val == 'string') { + // Check if value should be escaped as a string + var shouldEscape = + (col.typeid && + (col.typeid === 'STRING' || + col.typeid === 'VARCHAR' || + col.typeid === 'NVARCHAR' || + col.typeid === 'CHAR' || + col.typeid === 'NCHAR')) || + typeof val == 'string'; + if (shouldEscape) { val = "'" + escapeqq(val) + "'"; } - } - return val; - }); + return val; + }) + .join(','); s += ');\n'; } // if(filename === '') { diff --git a/test/test42.js b/test/test42.js new file mode 100644 index 0000000000..ddb7552142 --- /dev/null +++ b/test/test42.js @@ -0,0 +1,45 @@ +if (typeof exports === 'object') { + var assert = require('assert'); + var alasql = require('..'); +} + +describe('Test 42 - NULL values in INTO SQL()', function () { + it('1. Should output NULL for null values', () => { + var data = [ + {a: 1, b: 'test', c: null, d: 3}, + {a: 2, b: null, c: 4, d: null}, + {a: null, b: 'value', c: null, d: null}, + ]; + var res = alasql('SELECT * INTO SQL({tableid:"test_table"}) FROM ?', [data]); + + var expected = + "INSERT INTO test_table(a,b,c,d) VALUES (1,'test',NULL,3);\n" + + 'INSERT INTO test_table(a,b,c,d) VALUES (2,NULL,4,NULL);\n' + + "INSERT INTO test_table(a,b,c,d) VALUES (NULL,'value',NULL,NULL);\n"; + + assert.deepEqual(res, expected); + }); + + it('2. Should handle undefined values as NULL', () => { + var data = [ + {a: 1, b: 'test'}, + {a: 2, b: undefined, c: 4}, + ]; + var res = alasql('SELECT * INTO SQL({tableid:"test_table"}) FROM ?', [data]); + + var expected = + "INSERT INTO test_table(a,b) VALUES (1,'test');\n" + + 'INSERT INTO test_table(a,b) VALUES (2,NULL);\n'; + + assert.deepEqual(res, expected); + }); + + it('3. Should handle mixed NULL, undefined, and empty strings', () => { + var data = [{a: 1, b: '', c: null, d: undefined}]; + var res = alasql('SELECT * INTO SQL({tableid:"test_table"}) FROM ?', [data]); + + var expected = "INSERT INTO test_table(a,b,c,d) VALUES (1,'',NULL,NULL);\n"; + + assert.deepEqual(res, expected); + }); +});