All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project aims to adhere to Semantic Versioning.
Given that the parser produces a typed AST, any changes to the AST will technically be breaking and thus will result in a 0.(N+1)
version. We document changes that break via addition as "Added".
Check https://github.com/ballista-compute/sqlparser-rs/commits/main for undocumented changes.
- Change the MySQL dialect to support
`identifiers`
quoted with backticks instead of the standard"double-quoted"
identifiers (#247) - thanks @mashuai! - Update bigdecimal requirement from 0.1 to 0.2 (#268)
- Enable dialect-specific behaviours in the parser (
dialect_of!()
) (#254) - thanks @eyalleshem! - Support named arguments in function invocations (
ARG_NAME => val
) (#250) - thanks @eyalleshem! - Support
TABLE()
functions inFROM
(#253) - thanks @eyalleshem! - Support Snowflake's single-line comments starting with '#' or '//' (#264) - thanks @eyalleshem!
- Support PostgreSQL
PREPARE
,EXECUTE
, andDEALLOCATE
(#243) - thanks @silathdiir! - Support PostgreSQL math operators (#267) - thanks @alex-dukhno!
- Add SQLite dialect (#248) - thanks @mashuai!
- Add Snowflake dialect (#259) - thanks @eyalleshem!
- DDL:
- Support
OR REPLACE
inCREATE VIEW
/TABLE
(#239) - thanks @Dandandan! - Support specifying
ASC
/DESC
in index columns (#249) - thanks @mashuai! - Support SQLite
AUTOINCREMENT
and MySQLAUTO_INCREMENT
column option inCREATE TABLE
(#234) - thanks @mashuai! - Support PostgreSQL
IF NOT EXISTS
forCREATE SCHEMA
(#276) - thanks @alex-dukhno!
- Support
- Fix a typo in
JSONFILE
serialization, introduced in 0.3.1 (#237) - Change
CREATE INDEX
serialization to not end with a semicolon, introduced in 0.5.1 (#245) - Don't fail parsing
ALTER TABLE ADD COLUMN
ending with a semicolon, introduced in 0.5.1 (#246) - thanks @mashuai
- Support BigQuery
ASSERT
statement (#226)
- Support SQLite's
CREATE TABLE (...) WITHOUT ROWID
(#208) - thanks @mashuai! - Support SQLite's
CREATE VIRTUAL TABLE
(#209) - thanks @mashuai!
This release should have been called 0.6
, as it introduces multiple incompatible changes to the API. If you don't want to upgrade yet, you can revert to the previous version by changing your Cargo.toml
to:
sqlparser = "= 0.5.0"
Parser::parse_sql
now accepts a&str
instead ofString
(#182) - thanks @Dandandan!- Change
Ident
(previously a simpleString
) to store the parsed (unquoted)value
of the identifier and thequote_style
separately (#143) - thanks @apparebit! - Support Snowflake's
FROM (table_name)
(#155) - thanks @eyalleshem! - Add line and column number to TokenizerError (#194) - thanks @Dandandan!
- Use Token::EOF instead of Option (#195)
- Make the units keyword following
INTERVAL '...'
optional (#184) - thanks @maxcountryman! - Generalize
DATE
/TIME
/TIMESTAMP
literals representation in the AST (TypedString { data_type, value }
) and allowDATE
and other keywords to be used as identifiers when not followed by a string (#187) - thanks @maxcountryman! - Output DataType capitalized (
fmt::Display
) (#202) - thanks @Dandandan!
- Support MSSQL
TOP (<N>) [ PERCENT ] [ WITH TIES ]
(#150) - thanks @alexkyllo! - Support MySQL
LIMIT row_count OFFSET offset
(not followed byROW
orROWS
) and remember which variant was parsed (#158) - thanks @mjibson! - Support PostgreSQL
CREATE TABLE IF NOT EXISTS table_name
(#163) - thanks @alex-dukhno! - Support basic forms of
CREATE INDEX
andDROP INDEX
(#167) - thanks @mashuai! - Support
ON { UPDATE | DELETE } { RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT }
inFOREIGN KEY
constraints (#170) - thanks @c7hm4r! - Support basic forms of
CREATE SCHEMA
andDROP SCHEMA
(#173) - thanks @alex-dukhno! - Support
NULLS FIRST
/LAST
inORDER BY
expressions (#176) - thanks @houqp! - Support
LISTAGG()
(#174) - thanks @maxcountryman! - Support the string concatentation operator
||
(#178) - thanks @Dandandan! - Support bitwise AND (
&
), OR (|
), XOR (^
) (#181) - thanks @Dandandan! - Add serde support to AST structs and enums (#196) - thanks @panarch!
- Support
ALTER TABLE ADD COLUMN
,RENAME COLUMN
, andRENAME TO
(#203) - thanks @mashuai! - Support
ALTER TABLE DROP COLUMN
(#148) - thanks @ivanceras! - Support
CREATE TABLE ... AS ...
(#206) - thanks @Dandandan!
- Report an error for unterminated string literals (#165)
- Make file format (
STORED AS
) case insensitive (#200) and don't allow quoting it (#201) - thanks @Dandandan!
- Replace the
Value::Long(u64)
andValue::Double(f64)
variants withValue::Number(String)
to avoid losing precision when parsing decimal literals (#130) - thanks @benesch! --features bigdecimal
can be enabled to work withValue::Number(BigDecimal)
instead, at the cost of an additional dependency.
- Support MySQL
SHOW COLUMNS
,SET <variable>=<value>
, andSHOW <variable>
statements (#135) - thanks @quodlibetor and @benesch!
- Don't fail to parse
START TRANSACTION
followed by a semicolon (#139) - thanks @gaffneyk!
This release brings us closer to SQL-92 support, mainly thanks to the improvements contributed back from @MaterializeInc's fork and other work by @benesch.
- Remove "SQL" from type and enum variant names,
SQLType
->DataType
, remove "sql" prefix from module names (#105, #122) - Rename
ASTNode
->Expr
(#119) - Improve consistency of binary/unary op nodes (#112):
ASTNode::SQLBinaryExpr
is nowExpr::BinaryOp
andASTNode::SQLUnary
isExpr::UnaryOp
;- The
op: SQLOperator
field is now either aBinaryOperator
or anUnaryOperator
.
- Change the representation of JOINs to match the standard (#109):
SQLSelect
'srelation
andjoins
are replaced withfrom: Vec<TableWithJoins>
. Before this changeFROM foo NATURAL JOIN bar, baz
was represented as "foo" as therelation
followed by two joins (Inner(Natural)
andImplicit
); now it's twoTableWithJoins
(foo NATURAL JOIN bar
andbaz
). - Extract a
SQLFunction
struct (#89) - Replace
Option<Vec<T>>
withVec<T>
in the AST structs (#73) - Change
Value::Long()
to be unsigned, use u64 consistently (#65)
- Infra:
- Implement
fmt::Display
on AST nodes (#124) - thanks @vemoo! - Implement
Hash
(#88) andEq
(#123) on all AST nodes - Implement
std::error::Error
forParserError
(#72) - Handle Windows line-breaks (#54)
- Implement
- Expressions:
- Support
INTERVAL
literals (#103) - Support
DATE
/TIME
/TIMESTAMP
literals (#99) - Support
EXTRACT
(#96) - Support
X'hex value'
literals (#95) - Support
EXISTS
subqueries (#90) - Support nested expressions in
BETWEEN
(#80) - Support
COUNT(DISTINCT x)
and similar (#77) - Support
CASE operand WHEN expected_value THEN ..
and table-valued functions (#59) - Support analytic (window) functions (
OVER
clause) (#50)
- Support
- Queries / DML:
- Support nested joins (#100) and derived tables with set operations (#111)
- Support
UPDATE
statements (#97) - Support
INSERT INTO foo SELECT * FROM bar
andFROM VALUES (...)
(#91) - Support
SELECT ALL
(#76) - Add
FETCH
andOFFSET
support, andLATERAL
(#69) - thanks @thomas-jeepe! - Support
COLLATE
, optional column list in CTEs (#64)
- DDL/TCL:
- Support
START/SET/COMMIT/ROLLBACK TRANSACTION
(#106) - thanks @SamuelMarks! - Parse column constraints in any order (#93)
- Parse
DECIMAL
andDEC
aliases forNUMERIC
type (#92) - Support
DROP [TABLE|VIEW]
(#75) - Support arbitrary
WITH
options forCREATE [TABLE|VIEW]
(#74) - Support constraints in
CREATE TABLE
(#65)
- Support
- Add basic MSSQL dialect (#61) and some MSSQL-specific features:
CROSS
/OUTER APPLY
(#120)- MSSQL identifier and alias parsing rules (#66)
WITH
hints (#59)
- Report an error for
SELECT * FROM a OUTER JOIN b
instead of parsingOUTER
as an alias (#118) - Fix the precedence of
NOT LIKE
(#82) and unaryNOT
(#107) - Do not panic when
NOT
is not followed by an expected keyword (#71) successfully instead of returning a parse error - thanks @ivanceras! (#67) - and similar fixes for queries with noFROM
(#116) - Fix issues with
ALTER TABLE ADD CONSTRAINT
parsing (#65) - Serialize the "not equals" operator as
<>
instead of!=
(#64) - Remove dependencies on
uuid
(#59) andchrono
(#61) - Make
SELECT
query withLIMIT
clause but noWHERE
parse - Fix incorrect behavior ofASTNode::SQLQualifiedWildcard::to_string()
(returnedfoo*
instead offoo.*
) - thanks @thomas-jeepe! (#52)
- Extended
SQLStatement::SQLCreateTable
to support Hive's EXTERNAL TABLES (CREATE EXTERNAL TABLE .. STORED AS .. LOCATION '..'
) - thanks @zhzy0077! (#46) - Parse
SELECT DISTINCT
toSQLSelect::distinct
(#49)
This release includes major changes to the AST structs to add a number of features, as described in #37 and #43. In particular:
ASTNode
variants that represent statements were extracted fromASTNode
into a separateSQLStatement
enum;Parser::parse_sql
now returns aVec
of parsed statements.ASTNode
now represents an expression (renamed toExpr
in 0.4.0)
- The query representation (formerly
ASTNode::SQLSelect
) became more complicated to support:WITH
andUNION
/EXCEPT
/INTERSECT
(viaSQLQuery
,Cte
, andSQLSetExpr
),- aliases and qualified wildcards in
SELECT
(viaSQLSelectItem
), - and aliases in
FROM
/JOIN
(viaTableFactor
).
- A new
SQLObjectName
struct is used instead ofString
orASTNode::SQLCompoundIdentifier
- for objects like tables, custom types, etc. - Added support for "delimited identifiers" and made keywords context-specific (thus accepting them as valid identifiers in most contexts) - this caused a regression in parsing
SELECT .. FROM .. LIMIT ..
(#67), fixed in 0.4.0
Other than the changes listed above, some less intrusive additions include:
- Support
CREATE [MATERIALIZED] VIEW
statement - Support
IN
,BETWEEN
, unary +/- in epressions - Support
CHAR
data type andNUMERIC
not followed by(p,s)
. - Support national string literals (
N'...'
)
Same as 0.2.2.
- Removed
Value::String
,Value::DoubleQuotedString
, andToken::String
, making'...'
parse as a string literal (Value::SingleQuotedString
), and"..."
fail to parse until version 0.3.0 (#36)
We don't have a changelog for the changes made in 2018, but thanks to @crw5996, @cswinter, @fredrikroos, @ivanceras, @nickolay, @virattara for their contributions in the early stages of the project!
Initial release