From 8043656061ce969981ebe3b099d862ea82642ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=82=B1?= Date: Mon, 30 Oct 2023 15:46:20 +0800 Subject: [PATCH 1/2] release: v1.5.0 --- .gitignore | 1 + CHANGELOG | 1 + Makefile | 5 ++++- README.md | 15 +++++++++++---- package.json | 2 +- src/sqlParser.jison | 2 +- src/stringify.js | 12 ------------ test/main.test.js | 14 ++++++++++++++ 8 files changed, 33 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index c1119a3..1a8c027 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ package-lock.json *.log *.swp dist/parser/sqlParser.js +.vscode/ diff --git a/CHANGELOG b/CHANGELOG index 35c0dd0..dc5dd0a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,3 +10,4 @@ 1.3.0 fix tableFactor alias bug. AST changed in tableFactor. #34 1.4.0 fix bug `using ' & " for column alias?` #40 #44 1.4.1 hogfix "support quoted alias: multiple alias and orderby support" +1.5.0 support feature placeholder. diff --git a/Makefile b/Makefile index 51dd70d..ca658ba 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,10 @@ publish: test @npm publish -test: +test: @npm test +test-with-log: + @DEBUG=js-sql-parser npm test + .PHONY: publish test diff --git a/README.md b/README.md index ef48aab..1960e46 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ sql grammar follows https://dev.mysql.com/doc/refman/5.7/en/select.html ## news +- Support feature `PlaceHolder like ${param}` since v1.5.0 [#43](https://github.com/JavaScriptor/js-sql-parser/pull/43) - Fix bug `using ' & " for column alias?` since v1.4.1 [#40](https://github.com/JavaScriptor/js-sql-parser/issues/40), [#44](https://github.com/JavaScriptor/js-sql-parser/issues/44) - Fix bug tableFactor alias since v1.3.0 [#34](https://github.com/JavaScriptor/js-sql-parser/issues/34) - Add support for "`" quoted alias since v1.2.2. [#33](https://github.com/JavaScriptor/js-sql-parser/issues/33) @@ -35,6 +36,16 @@ console.log(parser.stringify(ast)); // SELECT foo FROM bar ``` +```js +// placeholder test +const parser = require('js-sql-parser'); +const ast = parser.parse('select ${a} as a'); + +ast['value']['selectItems']['value'][0]['value'] = "'value'"; +console.log(parser.stringify(ast)); +// SELECT 'value' AS a +``` + ## script tag ```js @@ -60,10 +71,6 @@ var sql = sqlParser.stringify(ast); - intervalexpr: Date INTERVAL keyword. // to support - into outfile: INTO OUTFILE keyword. // to support -## TODO - -- ${value} like value place holder support. - ## Build - Run `npm run build` to build the distributable. diff --git a/package.json b/package.json index 23bf5b5..223a2f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-sql-parser", - "version": "1.4.1", + "version": "1.5.0", "description": "", "main": "./dist/parser/sqlParser.js", "scripts": { diff --git a/src/sqlParser.jison b/src/sqlParser.jison index 4a8efbc..ace8618 100644 --- a/src/sqlParser.jison +++ b/src/sqlParser.jison @@ -11,7 +11,7 @@ [#]\s.*\n /* skip sql comments */ \s+ /* skip whitespace */ -[$][{](.*?)[}] return 'PLACE_HOLDER' +[$][{](.+?)[}] return 'PLACE_HOLDER' [`][a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*[`] return 'IDENTIFIER' [\w]+[\u4e00-\u9fa5]+[0-9a-zA-Z_\u4e00-\u9fa5]* return 'IDENTIFIER' [\u4e00-\u9fa5][0-9a-zA-Z_\u4e00-\u9fa5]* return 'IDENTIFIER' diff --git a/src/stringify.js b/src/stringify.js index 635e801..4679850 100644 --- a/src/stringify.js +++ b/src/stringify.js @@ -552,18 +552,6 @@ Sql.prototype.travelSelectParenthesized = function(ast) { this.appendKeyword(')'); }; Sql.prototype.travelPlaceHolder = function (ast) { - if (ast.left) { - this.travel(ast.left); - } - - if (ast.operator) { - this.append(ast.operator); - } - - if (ast.right) { - this.append(ast.right); - } - if (ast.value) { this.travel(ast.value); } diff --git a/test/main.test.js b/test/main.test.js index 2ee9c1b..379f7f4 100644 --- a/test/main.test.js +++ b/test/main.test.js @@ -2,6 +2,7 @@ const debug = require('debug')('js-sql-parser'); const parser = require('../'); +const assert = require('assert'); const testParser = function (sql) { let firstAst = parser.parse(sql); @@ -416,6 +417,19 @@ describe('select grammar support', function () { "select sum(quota_value) value, busi_col2 as sh, ${a} as a, YEAR(now()) from der_quota_summary where table_ename = 'gshmyyszje_derivedidx' and cd = (select id from t1 where a = ${t1})" ) }); + it('place holder support2', function() { + testParser( + "select sum(quota_value) b, busi_col2 as sh, '${a}' as a, YEAR(now()) from der_quota_summary where table_ename = 'gshmyyszje_derivedidx' and cd = (select id from t1 where a = '${t1}')" + ) + }); + it('place holder support3', function() { + let firstAst = parser.parse('select ${a} as a'); + firstAst['value']['selectItems']['value'][0]['value'] = "'value'"; + let firstSql = parser.stringify(firstAst); + debug(JSON.stringify(firstAst, null, 2)); + assert.equal(firstSql.trim().toUpperCase(), "select 'value' as a".toUpperCase()); + testParser(firstSql); + }); it('support quoted alias: multiple alias and orderby support', function () { testParser('select a as `A A`, b as `B B` from z'); From 203c5dea8614cb7afe4e3a04effc9131b9f6e54b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=82=B1?= Date: Tue, 31 Oct 2023 10:51:15 +0800 Subject: [PATCH 2/2] chore: add placeholder Note to readme. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1960e46..ffa2b84 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,8 @@ console.log(parser.stringify(ast)); // SELECT 'value' AS a ``` +Note: PlaceHolder is an `literal` value but not an `identifier`. Table_name / column_name / function_name are `identifier` thus should NOT be placed with placeholder. + ## script tag ```js