branch: externals/sql-indent
commit 580cb4b2f1f5f4c11058105adb61f78cf5eb2568
Author: Pierre Téchoueyres <[email protected]>
Commit: Alex Harsányi <[email protected]>
Try to correct 'bad closing for begin block' message. (#36)
Detection of for .. loop inside another statement
see "test-data/pr36.sql" for an example.
---
sql-indent-test.el | 7 +++++++
sql-indent.el | 4 ++--
test-data/pr36-io-left.eld | 1 +
test-data/pr36-syn.eld | 43 +++++++++++++++++++++++++++++++++++++++++++
test-data/pr36.sql | 17 +++++++++++++++++
5 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/sql-indent-test.el b/sql-indent-test.el
index 95fc875..046ca07 100644
--- a/sql-indent-test.el
+++ b/sql-indent-test.el
@@ -319,4 +319,11 @@ information read from DATA-FILE (as generated by
"test-data/pr33.sql" "test-data/pr33-io-left.eld"
sqlind-indentation-left-offsets-alist 2))
+(ert-deftest sqlind-ert-pr36 ()
+ (sqlind-ert-check-file-syntax "test-data/pr36.sql" "test-data/pr36-syn.eld"))
+
+(ert-deftest sqlind-ert-pr36-io-left ()
+ (sqlind-ert-check-file-indentation "test-data/pr36.sql"
"test-data/pr36-io-left.eld"
+ sqlind-indentation-left-offsets-alist 2))
+
;;; sql-indent-test.el ends here
diff --git a/sql-indent.el b/sql-indent.el
index e77345f..d374d43 100644
--- a/sql-indent.el
+++ b/sql-indent.el
@@ -299,7 +299,7 @@ But don't go before LIMIT."
(catch 'done
(while (> (point) (or limit (point-min)))
(when (re-search-backward
-
";\\|:=\\|\\b\\(declare\\|begin\\|cursor\\|loop\\|if\\|then\\|else\\|elsif\\)\\b\\|)"
+
";\\|:=\\|\\b\\(declare\\|begin\\|cursor\\|for\\|loop\\|if\\|then\\|else\\|elsif\\)\\b\\|)"
limit 'noerror)
(unless (sqlind-in-comment-or-string (point))
(let ((candidate-pos (match-end 0)))
@@ -308,7 +308,7 @@ But don't go before LIMIT."
;; of the keywords inside one of them and think this is a
;; statement start.
(progn (forward-char 1) (forward-sexp -1)))
- ((looking-at "\\bcursor\\b")
+ ((looking-at "\\b\\(cursor\\|for\\)\\b")
;; statement begins at the start of the keyword
(throw 'done (point)))
((looking-at "\\b\\(then\\|else\\)\\b")
diff --git a/test-data/pr36-io-left.eld b/test-data/pr36-io-left.eld
new file mode 100644
index 0000000..e0fa856
--- /dev/null
+++ b/test-data/pr36-io-left.eld
@@ -0,0 +1 @@
+(0 2 4 6 8 6 4 2 0 0 0 0 0 0 0 0 0 0)
diff --git a/test-data/pr36-syn.eld b/test-data/pr36-syn.eld
new file mode 100644
index 0000000..a4089ff
--- /dev/null
+++ b/test-data/pr36-syn.eld
@@ -0,0 +1,43 @@
+((((block-start begin)
+ . 1)
+ (toplevel . 1))
+ (((in-begin-block toplevel-block "")
+ . 1))
+ (((in-block if "")
+ . 9))
+ (((in-block loop "")
+ . 27))
+ (((in-block if "")
+ . 53))
+ (((block-end if "")
+ . 53)
+ ((in-block if "")
+ . 53))
+ (((block-end loop "")
+ . 27)
+ ((in-block loop "")
+ . 27))
+ (((block-end if "")
+ . 9)
+ ((in-block if "")
+ . 9))
+ (((block-end toplevel-block "")
+ . 1)
+ ((in-begin-block toplevel-block "")
+ . 1))
+ ((toplevel . 1))
+ ((toplevel . 1))
+ ((comment-start . 1)
+ (toplevel . 1))
+ ((comment-start . 1)
+ (toplevel . 1))
+ ((comment-start . 1)
+ (toplevel . 1))
+ ((comment-start . 1)
+ (toplevel . 1))
+ ((comment-start . 1)
+ (toplevel . 1))
+ ((comment-start . 1)
+ (toplevel . 1))
+ ((toplevel . 1)))
+
diff --git a/test-data/pr36.sql b/test-data/pr36.sql
new file mode 100644
index 0000000..b24cd60
--- /dev/null
+++ b/test-data/pr36.sql
@@ -0,0 +1,17 @@
+begin
+ if a = b then
+ for rec in cur loop
+ if c = d then
+ inst1;
+ end if;
+ end loop;
+ end if;
+end;
+/
+
+-- Local Variables:
+-- mode: sql
+-- tab-width: 2
+-- indent-tabs-mode: nil
+-- sql-product: oracle
+-- End: