first version
authorChristian Weiske <cweiske@cweiske.de>
Wed, 9 Dec 2015 15:12:33 +0000 (16:12 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Wed, 9 Dec 2015 15:12:33 +0000 (16:12 +0100)
.gitignore [new file with mode: 0644]
bin/php-sqllint [new file with mode: 0755]
composer.json [new file with mode: 0644]
tests/files/create-missingcomma.sql [new file with mode: 0644]
tests/files/create-nocoldef.sql [new file with mode: 0644]
tests/files/create-noname.sql [new file with mode: 0644]
tests/files/create-ok.sql [new file with mode: 0644]
tests/files/create.sql [new file with mode: 0644]
tests/files/multiple.sql [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..ff72e2d
--- /dev/null
@@ -0,0 +1,2 @@
+/composer.lock
+/vendor
diff --git a/bin/php-sqllint b/bin/php-sqllint
new file mode 100755 (executable)
index 0000000..69372a0
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/env php
+<?php
+use SqlParser\Parser;
+
+require_once __DIR__ . '/../vendor/autoload.php';
+
+if ($argc < 2) {
+    echo "SQL file name missing\n";
+    exit(1);
+}
+$file = $argv[1];
+if ($file == '') {
+    echo "SQL file name empty\n";
+    exit(1);
+}
+if (!file_exists($file)) {
+    echo "SQL file does not exist\n";
+    exit(1);
+}
+
+$sql = file_get_contents($file);
+if (trim($sql) == '') {
+    echo "SQL file empty\n";
+    exit(1);
+}
+
+$parser = new Parser($sql);
+
+if (count($parser->errors) == 0) {
+    echo "No syntax errors detected\n";
+    exit(0);
+}
+
+$lines = array(1 => 0);
+$pos = -1;
+$line = 1;
+while (false !== $pos = strpos($sql, "\n", ++$pos)) {
+    $lines[++$line] = $pos;
+}
+
+echo "Syntax errors found\n";
+foreach ($parser->errors as $error) {
+    reset($lines);
+    $line = 1;
+    while (next($lines) && $error->token->position >= current($lines)) {
+        ++$line;
+    }
+    $col = $error->token->position - $lines[$line];
+
+    /** @var SqlParser\Exceptions\ParserException $error) */
+    echo 'Line ' . $line
+        . ' col ' . $col
+        //FIXME: ->token or ->value?
+        . ' at "' . niceToken($error->token->token) . '":'
+        . ' ' . $error->getMessage()
+        . "\n";
+    //var_dump($error->token);
+}
+
+function niceToken($str)
+{
+    return str_replace(
+        ["\n", "\r", "\t"],
+        ['\n', '\r', '\t'],
+        $str
+    );
+}
+?>
\ No newline at end of file
diff --git a/composer.json b/composer.json
new file mode 100644 (file)
index 0000000..750ddf1
--- /dev/null
@@ -0,0 +1,5 @@
+{
+    "require": {
+        "udan11/sql-parser": "^3.0"
+    }
+}
diff --git a/tests/files/create-missingcomma.sql b/tests/files/create-missingcomma.sql
new file mode 100644 (file)
index 0000000..0807c4b
--- /dev/null
@@ -0,0 +1,4 @@
+CREATE TABLE test (
+    uid INT(11) DEFAULT 0 NOT NULL
+    pid INT(11) DEFAULT 0 NOT NULL
+);
diff --git a/tests/files/create-nocoldef.sql b/tests/files/create-nocoldef.sql
new file mode 100644 (file)
index 0000000..9e98e62
--- /dev/null
@@ -0,0 +1,2 @@
+CREATE TABLE foo (
+);
diff --git a/tests/files/create-noname.sql b/tests/files/create-noname.sql
new file mode 100644 (file)
index 0000000..a2e1c24
--- /dev/null
@@ -0,0 +1 @@
+CREATE TABLE();
diff --git a/tests/files/create-ok.sql b/tests/files/create-ok.sql
new file mode 100644 (file)
index 0000000..f5ff243
--- /dev/null
@@ -0,0 +1,4 @@
+CREATE TABLE test (
+    uid INT(11) DEFAULT 0 NOT NULL,
+    pid INT(11) DEFAULT 0 NOT NULL
+);
diff --git a/tests/files/create.sql b/tests/files/create.sql
new file mode 100644 (file)
index 0000000..f5ff243
--- /dev/null
@@ -0,0 +1,4 @@
+CREATE TABLE test (
+    uid INT(11) DEFAULT 0 NOT NULL,
+    pid INT(11) DEFAULT 0 NOT NULL
+);
diff --git a/tests/files/multiple.sql b/tests/files/multiple.sql
new file mode 100644 (file)
index 0000000..37c3a59
--- /dev/null
@@ -0,0 +1,2 @@
+SELECT * FROM foo WHERE;
+SELECT foo FROM bar baz bat;