[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/sql-indent dccd194 02/13: Recognize `select-join-condit
From: |
Alex Harsanyi |
Subject: |
[elpa] externals/sql-indent dccd194 02/13: Recognize `select-join-condition` syntax inside nested statements #70 (#71) |
Date: |
Thu, 20 Jun 2019 05:25:45 -0400 (EDT) |
branch: externals/sql-indent
commit dccd194560c82d412213f85a2c43b0dc67534b71
Author: Alex Harsányi <address@hidden>
Commit: GitHub <address@hidden>
Recognize `select-join-condition` syntax inside nested statements #70 (#71)
Updated syntax parser to recognize some JOIN condition keywords as
`select-join-condition` syntax, even inside nested statements.
Updated some non-related tests (m, pr17 and pr68), as this syntax was not
recognized when these tests were written. While this change will modify the
indentation in such cases, it allows more refined control over the
indention.
* sql-indent.el (sqlind-join-condition-regexp): keywords that
constitute JOIN conditions
(sqlind-syntax-in-select): match `sqlind-join-condition-regexp`
when looking for join condition keywords
(sqlind-refine-syntax): try to refine a
`nested-statement-continuation into a `select-join-condition` if
there is a JOIN in the nested statement.
---
sql-indent-test.el | 3 ++
sql-indent.el | 24 +++++++++++--
test-data/m-io.eld | 2 +-
test-data/m-syn.eld | 6 ++--
test-data/pr17-io-default.eld | 2 +-
test-data/pr17-io-left.eld | 2 +-
test-data/pr17-io-right.eld | 2 +-
test-data/pr17-syn.eld | 8 ++---
test-data/pr68-syn.eld | 7 ++--
test-data/pr68.sql | 12 ++++---
test-data/pr70-syn.eld | 78 +++++++++++++++++++++++++++++++++++++++++++
test-data/pr70.sql | 39 ++++++++++++++++++++++
12 files changed, 165 insertions(+), 20 deletions(-)
diff --git a/sql-indent-test.el b/sql-indent-test.el
index df79c07..ef5d050 100644
--- a/sql-indent-test.el
+++ b/sql-indent-test.el
@@ -381,4 +381,7 @@ information read from DATA-FILE (as generated by
(ert-deftest sqlind-ert-pr68 ()
(sqlind-ert-check-file-syntax "test-data/pr68.sql" "test-data/pr68-syn.eld"))
+(ert-deftest sqlind-ert-pr70 ()
+ (sqlind-ert-check-file-syntax "test-data/pr70.sql" "test-data/pr70-syn.eld"))
+
;;; sql-indent-test.el ends here
diff --git a/sql-indent.el b/sql-indent.el
index 562485d..4e0fd34 100644
--- a/sql-indent.el
+++ b/sql-indent.el
@@ -963,6 +963,9 @@ reverse order (a stack) and is used to skip over nested
blocks."
(defconst sqlind-select-join-regexp
(regexp-opt '("inner" "left" "right" "natural" "cross") 'symbols))
+(defconst sqlind-join-condition-regexp
+ (regexp-opt '("on" "using" "and" "or") 'symbols))
+
(defun sqlind-syntax-in-select (pos start)
"Return the syntax ar POS which is inside a \"select\" statement at START."
(save-excursion
@@ -1007,8 +1010,8 @@ reverse order (a stack) and is used to skip over nested
blocks."
;; or the previous line ends with 'on' we have a join
;; condition
(goto-char pos)
- (when (or (looking-at "on")
- (progn (forward-word -1) (looking-at "on")))
+ (when (or (looking-at sqlind-join-condition-regexp)
+ (progn (forward-word -1) (looking-at
sqlind-select-join-regexp)))
;; look for the join start, that will be the anchor
(when (sqlind-search-backward (point) "\\bjoin\\b" start)
(let ((candidate (point)))
@@ -1412,6 +1415,23 @@ not a statement-continuation POS is the same as the
(when (looking-at "case")
(push (sqlind-syntax-in-case pos (point)) context))))))
+ (when (eq (sqlind-syntax-symbol context)
'nested-statement-continuation)
+ (save-excursion
+ ;; Look for a join expression inside a nested statement, see #70
+ (goto-char pos)
+ (when (or (looking-at sqlind-join-condition-regexp)
+ (progn (forward-word -1) (looking-at
sqlind-join-condition-regexp)))
+ ;; look for the join start, that will be the anchor
+ (when (sqlind-search-backward (point) "\\bjoin\\b" anchor)
+ (let ((candidate (point)))
+ (forward-char -1)
+ (sqlind-backward-syntactic-ws)
+ (backward-word)
+ (push (if (looking-at sqlind-select-join-regexp)
+ (cons 'select-join-condition (point))
+ (cons 'select-join-condition candidate))
+ context))))))
+
))
;; create block start syntax if needed
diff --git a/test-data/m-io.eld b/test-data/m-io.eld
index 403dd43..20a2c0f 100644
--- a/test-data/m-io.eld
+++ b/test-data/m-io.eld
@@ -1 +1 @@
-(0 4 4 6 6 4 0 4 4 4 4 4 4 4 10 4 4 4 8 4 4 0 0 10 16 16 16 16 20 20 20 16 12
16 10 1 5 0 0 0 6 6 2 6 0 4 0 4 0)
+(0 4 4 6 6 4 0 4 4 4 4 4 4 4 10 4 4 4 8 4 4 0 0 10 16 16 16 16 20 20 20 16 12
16 10 1 5 0 0 0 6 6 2 6 0 8 0 4 0)
diff --git a/test-data/m-syn.eld b/test-data/m-syn.eld
index 1bd9c80..fc31b9c 100644
--- a/test-data/m-syn.eld
+++ b/test-data/m-syn.eld
@@ -103,13 +103,13 @@
(statement-continuation . 926))
((nested-statement-close . 926)
(statement-continuation . 926))
- ((select-table-continuation . 411)
+ ((select-join-condition . 908)
(statement-continuation . 1))
((select-clause . 80)
(statement-continuation . 1))
(((in-select-clause "group by")
- . 1047)
+ . 1051)
(statement-continuation . 1))
(((in-select-clause "group by")
- . 1047)
+ . 1051)
(statement-continuation . 1)))
diff --git a/test-data/pr17-io-default.eld b/test-data/pr17-io-default.eld
index 78f87b1..f68308b 100644
--- a/test-data/pr17-io-default.eld
+++ b/test-data/pr17-io-default.eld
@@ -1 +1 @@
-(0 0 0 0 0 0 0 0 9 9 9 7 9 2 1 8 4 0 0 7 7 7 7 7 7 2 9 1 4 4 4 4 4 4 25 32 24
27 27 27 27 27 8 0 0 1 8 15 8 8 0 0 3 10 1 7 13 7 7 0 0 12 12 12 0 7 7 7 7 7 7
24 7 24 7 2 31 31 51 51 26 10 10 29 24 10 1 10 1 10 10 0 0 0 0)
+(0 0 0 0 0 0 0 0 9 9 9 7 9 2 1 8 4 0 0 7 7 7 7 7 7 2 9 1 4 4 4 4 4 4 25 32 24
27 27 27 27 27 8 0 0 1 8 15 8 8 0 0 3 10 1 7 13 7 7 0 0 12 12 12 0 7 7 7 7 7 7
24 7 24 7 2 31 31 51 51 26 10 10 29 24 14 1 10 1 10 10 0 0 0 0)
diff --git a/test-data/pr17-io-left.eld b/test-data/pr17-io-left.eld
index 4942879..e055a8e 100644
--- a/test-data/pr17-io-left.eld
+++ b/test-data/pr17-io-left.eld
@@ -1 +1 @@
-(0 0 0 0 0 0 0 0 10 10 10 7 4 0 0 12 0 0 0 7 7 7 7 7 7 0 7 0 0 0 0 0 0 0 19 26
19 19 19 19 19 19 0 0 0 0 0 7 0 0 0 0 0 7 0 0 6 0 0 0 0 2 3 3 0 7 7 7 7 7 7 24
7 24 7 0 29 29 49 49 22 7 2 21 14 2 0 9 0 9 0 0 0 0 0)
+(0 0 0 0 0 0 0 0 10 10 10 7 4 0 0 12 0 0 0 7 7 7 7 7 7 0 7 0 0 0 0 0 0 0 19 26
19 19 19 19 19 19 0 0 0 0 0 7 0 0 0 0 0 7 0 0 6 0 0 0 0 2 3 3 0 7 7 7 7 7 7 24
7 24 7 0 29 29 49 49 22 7 2 21 14 6 0 9 0 9 0 0 0 0 0)
diff --git a/test-data/pr17-io-right.eld b/test-data/pr17-io-right.eld
index 9a16743..6466e33 100644
--- a/test-data/pr17-io-right.eld
+++ b/test-data/pr17-io-right.eld
@@ -1 +1 @@
-(0 0 0 0 0 0 0 0 10 10 10 7 4 2 1 13 4 0 0 7 7 7 7 7 7 2 9 1 4 4 4 4 4 4 25 32
24 27 27 27 27 27 1 0 0 1 4 11 4 1 0 0 3 10 1 3 9 3 1 0 0 12 12 12 0 7 7 7 7 7
7 24 7 24 7 2 31 31 51 51 26 10 10 29 24 10 1 10 1 10 1 0 0 0 0)
\ No newline at end of file
+(0 0 0 0 0 0 0 0 10 10 10 7 4 2 1 13 4 0 0 7 7 7 7 7 7 2 9 1 4 4 4 4 4 4 25 32
24 27 27 27 27 27 1 0 0 1 4 11 4 1 0 0 3 10 1 3 9 3 1 0 0 12 12 12 0 7 7 7 7 7
7 24 7 24 7 2 31 31 51 51 26 10 10 29 24 14 1 10 1 10 1 0 0 0 0)
\ No newline at end of file
diff --git a/test-data/pr17-syn.eld b/test-data/pr17-syn.eld
index ce23662..1e8db9b 100644
--- a/test-data/pr17-syn.eld
+++ b/test-data/pr17-syn.eld
@@ -190,20 +190,20 @@
((select-clause . 2650)
(nested-statement-continuation . 2649)
(statement-continuation . 2649))
- ((select-table-continuation . 2271)
+ ((select-join-condition . 2638)
(statement-continuation . 1800))
((select-clause . 1902)
(statement-continuation . 1800))
(((in-select-clause "group by")
- . 2769)
+ . 2773)
(statement-continuation . 1800))
((select-clause . 1902)
(statement-continuation . 1800))
(((in-select-clause "order by")
- . 2798)
+ . 2802)
(statement-continuation . 1800))
(((in-select-clause "order by")
- . 2798)
+ . 2802)
(statement-continuation . 1800))
((comment-start . 33)
(toplevel . 33))
diff --git a/test-data/pr68-syn.eld b/test-data/pr68-syn.eld
index a3fdcc2..5167ac3 100644
--- a/test-data/pr68-syn.eld
+++ b/test-data/pr68-syn.eld
@@ -7,9 +7,12 @@
(statement-continuation . 34))
((nested-statement-continuation . 34)
(statement-continuation . 34))
+ ((select-join-condition . 61)
+ (nested-statement-continuation . 34)
+ (statement-continuation . 34))
((nested-statement-close . 34)
(statement-continuation . 34))
((select-join-condition . 29)
(statement-continuation . 1))
- ((select-table-continuation . 12)
- (statement-continuation . 1)))
\ No newline at end of file
+ ((toplevel . 1))
+ ((toplevel . 1)))
\ No newline at end of file
diff --git a/test-data/pr68.sql b/test-data/pr68.sql
index 313fa8a..04fef4c 100644
--- a/test-data/pr68.sql
+++ b/test-data/pr68.sql
@@ -1,7 +1,9 @@
-SELECT *
- FROM t1
- JOIN (
+select *
+ from t1
+ join (
t2
- LEFT JOIN t3 USING (k2)
+ left join t3
+ using (k2)
)
- ON t1.k1 = t2.k1
+ on t1.k1 = t2.k1;
+
diff --git a/test-data/pr70-syn.eld b/test-data/pr70-syn.eld
new file mode 100644
index 0000000..8b0612f
--- /dev/null
+++ b/test-data/pr70-syn.eld
@@ -0,0 +1,78 @@
+(((toplevel . 1))
+ ((select-column . 1)
+ (statement-continuation . 1))
+ ((select-clause . 1)
+ (statement-continuation . 1))
+ ((select-table-continuation . 14)
+ (statement-continuation . 1))
+ ((select-table-continuation . 14)
+ (statement-continuation . 1))
+ ((select-join-condition . 34)
+ (statement-continuation . 1))
+ ((select-join-condition . 34)
+ (statement-continuation . 1))
+ ((comment-start . 1)
+ (statement-continuation . 1))
+ ((select-table-continuation . 14)
+ (statement-continuation . 1))
+ ((nested-statement-open . 132)
+ (statement-continuation . 132))
+ ((nested-statement-continuation . 132)
+ (statement-continuation . 132))
+ ((select-join-condition . 153)
+ (nested-statement-continuation . 132)
+ (statement-continuation . 132))
+ ((select-join-condition . 153)
+ (nested-statement-continuation . 132)
+ (statement-continuation . 132))
+ ((nested-statement-close . 132)
+ (statement-continuation . 132))
+ ((select-join-condition . 127)
+ (statement-continuation . 1))
+ ((select-join-condition . 127)
+ (statement-continuation . 1))
+ ((toplevel . 1))
+ ((toplevel . 1))
+ ((select-column . 389)
+ (statement-continuation . 389))
+ ((select-clause . 389)
+ (statement-continuation . 389))
+ ((select-table-continuation . 402)
+ (statement-continuation . 389))
+ ((select-table-continuation . 402)
+ (statement-continuation . 389))
+ ((select-join-condition . 422)
+ (statement-continuation . 389))
+ ((nested-statement-continuation . 443)
+ (statement-continuation . 443))
+ ((comment-start . 389)
+ (statement-continuation . 389))
+ ((select-table-continuation . 402)
+ (statement-continuation . 389))
+ ((nested-statement-open . 606)
+ (statement-continuation . 606))
+ ((nested-statement-continuation . 606)
+ (statement-continuation . 606))
+ ((select-join-condition . 627)
+ (nested-statement-continuation . 606)
+ (statement-continuation . 606))
+ ((nested-statement-continuation . 655)
+ (statement-continuation . 655))
+ ((nested-statement-close . 606)
+ (statement-continuation . 606))
+ ((select-join-condition . 601)
+ (statement-continuation . 389))
+ ((nested-statement-continuation . 771)
+ (statement-continuation . 771))
+ ((toplevel . 1))
+ ((toplevel . 1))
+ ((toplevel . 1))
+ ((nested-statement-continuation . 874)
+ (statement-continuation . 874))
+ ((select-join-condition . 885)
+ (nested-statement-continuation . 874)
+ (statement-continuation . 874))
+ ((select-clause . 867)
+ (statement-continuation . 867))
+ ((toplevel . 1)))
+
\ No newline at end of file
diff --git a/test-data/pr70.sql b/test-data/pr70.sql
new file mode 100644
index 0000000..b480b48
--- /dev/null
+++ b/test-data/pr70.sql
@@ -0,0 +1,39 @@
+select
+ *
+ from
+ t1
+ join t2
+ on t1.k = t2.k
+ and t1.j = t2.j
+ -- here's a "nested join"
+ join (
+ t3
+ left join t4
+ on t3.k = t4.k
+ and t3.j = t4.j -- this "and" is a
select-join-condition
+ )
+ on t1.k = t3.k
+ and t1.k = t4.k; -- this "and" is a
select-join-condition
+
+select
+ *
+ from
+ t1
+ join t2
+ on (t1.k = t2.k
+ and t1.j = t2.j) -- this "and" is a
nested-statement-continuation
+ -- here's a "nested join"
+ join (
+ t3
+ left join t4
+ on (t3.k = t4.k
+ and t3.j = t4.j) -- this "and" is a
nested-statement-continuation
+ )
+ on (t1.k = t3.k
+ and t1.k = t4.k); -- this "and" is a
nested-statement-continuation
+
+
+select (a
+ join b
+ on a.k1 = b.k2) -- this is a select-join-condition (hey! we're not
an sql parser
+ from a, b;
- [elpa] externals/sql-indent updated (87a6b4a -> 47e9ccb), Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent 9d5f978 05/13: Fix regexp bug in `sqlind-good-if-candidate` (fixes #76), Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent 31c29ed 12/13: Recognize more types of begin transaction statements (fixes #84), Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent 2ca9610 09/13: don't be confused by drop function or procedure statements #80, Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent f897c11 08/13: Apply advices of `checkdoc' (#77), Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent dccd194 02/13: Recognize `select-join-condition` syntax inside nested statements #70 (#71),
Alex Harsanyi <=
- [elpa] externals/sql-indent e7e7e85 11/13: Don't recognize select keywords in comments, fixes #83, Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent 47e9ccb 13/13: Recognize left and right outer join statements #85, Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent e511ced 01/13: `sqlind-search-backward` finds things at the same nesting level (#68) (#69), Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent d9442ed 03/13: Recognize FULL JOIN, UNION ALL and EXCEPT keywords #73 (#74), Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent 1974564 10/13: recognize elseif in addition to elif #81, Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent 9559ebe 07/13: Fix `sqlind-comment-end' regexp. (#79), Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent ba2a690 06/13: also fix sqlind-end-statement-regexp, Alex Harsanyi, 2019/06/20
- [elpa] externals/sql-indent a6da8bd 04/13: Recognize more create keywords (#75), Alex Harsanyi, 2019/06/20