Commit graph

333 commits

Author SHA1 Message Date
Nickolay Ponomarev
364f62f333 Parse table-valued functions and MSSQL-specific WITH hints
1) Table-valued functions (`FROM possibly_qualified.fn(arg1, ...)`) is
not part of ANSI SQL, but is supported in Postgres and MSSQL at least:
- "38.5.7. SQL Functions as Table Sources" <https://www.postgresql.org/docs/current/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS>
- `user_defined_function` in "FROM (Transact-SQL)" <https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-2017>

I've considered renaming TableFactor::Table to something else (Object?),
now that it can be a TVF, but couldn't come up with a satisfactory name.

2) "WITH hints" is MSSQL-specific syntax
<https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017>

Note that MSSQL supports the following ways of specifying hints, which
are parsed with varying degrees of accuracy:
- `FROM tab (NOLOCK)` -- deprecated syntax, parsed as a function with a `NOLOCK` argument
- `FROM tab C (NOLOCK)` -- deprecated syntax, rejected ATM
- `FROM TAB C WITH (NOLOCK)` -- OK
2019-04-27 21:14:18 +03:00
Nickolay Ponomarev
e5e3d71354 Support CASE operand WHEN expected_value THEN ..
Another part of #15
2019-04-27 21:14:18 +03:00
Nickolay Ponomarev
2aa4c267e7 Simplify CASE parsing 2019-04-27 21:14:18 +03:00
Nickolay Ponomarev
e5c0c426b7 Simplify parse_infix()
- ASTNode::SQLBinaryExpr is now constructed in one location
- There's no duplicate calls to parse_in/parse_between
- The list of tokens that correspond to operators is not duplicated
  in parse_infix / to_sql_operator
- ...which made it easy to distinguish between errors that could be
  caused by invalid input and internal errors. I switched the latter
  to `panic!()`
2019-04-27 21:14:18 +03:00
Nickolay Ponomarev
d65274bc31 Improve ALTER error messages for unsupported syntax 2019-04-27 21:14:18 +03:00
Nickolay Ponomarev
787cd9a717 Add Parser::expected() for more succinct error handling 2019-04-27 21:14:18 +03:00
Nickolay Ponomarev
c679c7a5b4 Remove Value::Uuid
We don't have the code to parse UUID literals, so it's dead code, that
brings in the dependency on `uuid`.

I kept SQLType::Uuid, as it's not dead code, though it ought to be
dialect-specific.
2019-04-27 21:14:18 +03:00
Nickolay Ponomarev
6bb2acc9f8
Merge pull request #50 from nickolay/window-functions
Support OVER clause for window/analytic functions, add support for qualified function names
2019-04-27 21:12:08 +03:00
Andy Grove
64b1ea7a25
Merge pull request #54 from nickolay/windows-newlines
Support \r and \r\n line breaks in tokenizer
2019-04-27 08:54:20 -06:00
Andy Grove
07d66a93ef
Merge pull request #53 from thomas-jeepe/master
Fix qualified wildcard stringifying
2019-04-27 08:53:08 -06:00
Andy Grove
4cdd003cd4
Merge pull request #51 from nickolay/rust-2018
Rust 2018 and clippy fixes
2019-04-27 08:51:43 -06:00
Nickolay Ponomarev
bf3110f6ce Use consume_and_return when possible 2019-04-27 02:51:10 +03:00
Nickolay Ponomarev
6f44494910 Support \r and \r\n line breaks in tokenizer 2019-04-26 02:53:39 +03:00
Justin Haug
76d2d46496 run cargo fmt 2019-04-22 18:06:00 -04:00
Justin Haug
f9fb4bedfb Move wildcard test to generic parser 2019-04-22 17:52:15 -04:00
Justin Haug
80aceba630 run cargo fmt 2019-04-22 17:50:12 -04:00
Justin Haug
80dccf6885 Add support for escaping single quote strings 2019-04-22 13:32:05 -04:00
Justin Haug
5b464e6b1a Fix qualified wildcard stringifying 2019-04-22 13:10:29 -04:00
Nickolay Ponomarev
098d1c4a17 Enable clippy lints by default in RLS 2019-04-21 04:46:19 +03:00
Nickolay Ponomarev
50a2310173 Rename SQLStatement::SQLSelect to SQLQuery
The name was confusing:
SQLStatement::SQLSelect(
  SQLQuery {
    body: SQLSetExpr::Select(SQLSelect)
  }
)

Fix the `large_enum_variant` clippy lint for `SQLStatement::SQLQuery`
`SQLStatement::SQLCreateView`, and `SQLSetExpr::Select`, while we're
changing the AST anyway
https://rust-lang.github.io/rust-clippy/master/index.html#large_enum_variant
2019-04-21 04:46:19 +03:00
Nickolay Ponomarev
08bbce8992 Use assert_matches! instead of matching manually
To fix clippy warnings about assert!(true / false)
2019-04-21 04:46:19 +03:00
Nickolay Ponomarev
dee30aabe0 Fix the clippy assert!(false) lint
https://rust-lang.github.io/rust-clippy/master/index.html#assertions_on_constants

While I don't feel it's valid, fixing it lets us act on the other, more
useful, lints.
2019-04-21 04:46:19 +03:00
Nickolay Ponomarev
a3a8626e6b Fix a clippy lint and reduce duplication in SQLType::to_string() 2019-04-21 04:46:19 +03:00
Nickolay Ponomarev
c223eaf0aa Fix a bunch of trivial clippy lints 2019-04-21 04:46:19 +03:00
Nickolay Ponomarev
3df2223d95 Fix clippy if_same_then_else lint
https://rust-lang.github.io/rust-clippy/master/#if_same_then_else

There was a bug in parsing `TIME` (not followed by {WITH | WITHOUT}
TIME ZONE) -- that parsed as SQLType::Timestamp instead of SQLType::Time
2019-04-21 04:41:11 +03:00
Nickolay Ponomarev
0634ec4a83 Apply suggestions from cargo fix --edition-idioms 2019-04-21 04:41:11 +03:00
Nickolay Ponomarev
b12a19e197 Switch to the Rust 2018 edition
This requires Rust 1.31 (from last year) to build, but is otherwise
compatible with the 2015-edition code.
2019-04-21 04:41:11 +03:00
Nickolay Ponomarev
9a244e059e Fix clippy lints in "Support qualified function names" 2019-04-21 02:05:36 +03:00
Nickolay Ponomarev
de057deff6 Fix clippy lints in comma_separated_string 2019-04-21 02:05:36 +03:00
Nickolay Ponomarev
8c7e1d1c54 Update sample output in README 2019-04-20 22:51:29 +03:00
Nickolay Ponomarev
085e8a6b04 Use named fields in ExpressionWithAlias instead of a tuple
(This produces more natural JSON representation when serializing AST
with serde.)
2019-04-20 22:51:29 +03:00
Nickolay Ponomarev
4a5dc8dd4b Support qualified function names
...e.g. `db.schema.func()`
2019-04-20 22:51:29 +03:00
Nickolay Ponomarev
d4de248c73 Support OVER clause for window/analytic functions
Since this changes SQLFunction anyway, changed its `id` field to `name`,
as we don't seem to use "id" to mean "name" anywhere else.
2019-04-20 22:51:29 +03:00
Nickolay Ponomarev
c8e7c3b343 Introduce comma_separated_string() to reduce boilerplate in ToString impls 2019-04-20 22:51:29 +03:00
Andy Grove
ef76baa7fd (cargo-release) start next development iteration 0.3.1 2019-04-20 07:33:37 -06:00
Andy Grove
1aa4733890 bump version 2019-04-20 07:33:21 -06:00
Andy Grove
6ebd5dd819
Merge pull request #49 from nickolay/select-distinct
Support SELECT DISTINCT, and a few minor tweaks
2019-04-20 07:26:13 -06:00
Nickolay Ponomarev
bbf1805729 Support SELECT DISTINCT 2019-04-20 14:21:26 +03:00
Nickolay Ponomarev
31b6076d05 Use the same order in #[derive()] for all AST types
(So that adding another trait can be done with a global search and replace.)
2019-04-20 14:21:26 +03:00
Nickolay Ponomarev
e113dee7e8 Fix error text for unexpected token after NOT 2019-04-20 14:21:26 +03:00
Nickolay Ponomarev
5263ee1e9e Reduce nesting of ifs in SQLType::Decimal::to_string() 2019-04-20 14:21:26 +03:00
Nickolay Ponomarev
451513db5b Simplify parse_function() 2019-04-20 14:21:26 +03:00
Andy Grove
d9591cd999
Merge pull request #46 from zhzy0077/feature/external_table
Thanks @zhzy0077 !
2019-04-13 11:32:38 -06:00
Zhiyuan Zheng
d8f824c400 merge CreateExternalTable & CreateTable. 2019-04-14 01:05:26 +08:00
Zhiyuan Zheng
35556593f5
Delete test sql file. 2019-04-11 10:53:33 +08:00
Zhiyuan Zheng
26940920ac Add unit tests. 2019-04-09 13:28:01 +08:00
Zhiyuan Zheng
f0f6082eff support create external table 2019-04-08 21:36:02 +08:00
Andy Grove
d1b5668fd3
Merge pull request #43 from nickolay/master 2019-04-02 21:27:30 -06:00
Nickolay Ponomarev
311f2ab429 bump version to 0.3.0, as requested in the PR 2019-04-02 09:46:21 +03:00
Nickolay Ponomarev
5de23b1e78 Merge branch 'upstream' 2019-04-02 09:16:51 +03:00