mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-11 06:22:04 +00:00
Add support for MSSQL's JSON_ARRAY
/JSON_OBJECT
expr (#1507)
Co-authored-by: Ifeanyi Ubah <ify1992@yahoo.com>
This commit is contained in:
parent
f961efc0c9
commit
92be237cfc
9 changed files with 617 additions and 44 deletions
|
@ -5449,6 +5449,8 @@ pub enum FunctionArgOperator {
|
|||
RightArrow,
|
||||
/// function(arg1 := value1)
|
||||
Assignment,
|
||||
/// function(arg1 : value1)
|
||||
Colon,
|
||||
}
|
||||
|
||||
impl fmt::Display for FunctionArgOperator {
|
||||
|
@ -5457,6 +5459,7 @@ impl fmt::Display for FunctionArgOperator {
|
|||
FunctionArgOperator::Equals => f.write_str("="),
|
||||
FunctionArgOperator::RightArrow => f.write_str("=>"),
|
||||
FunctionArgOperator::Assignment => f.write_str(":="),
|
||||
FunctionArgOperator::Colon => f.write_str(":"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5465,11 +5468,22 @@ impl fmt::Display for FunctionArgOperator {
|
|||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
|
||||
pub enum FunctionArg {
|
||||
/// `name` is identifier
|
||||
///
|
||||
/// Enabled when `Dialect::supports_named_fn_args_with_expr_name` returns 'false'
|
||||
Named {
|
||||
name: Ident,
|
||||
arg: FunctionArgExpr,
|
||||
operator: FunctionArgOperator,
|
||||
},
|
||||
/// `name` is arbitrary expression
|
||||
///
|
||||
/// Enabled when `Dialect::supports_named_fn_args_with_expr_name` returns 'true'
|
||||
ExprNamed {
|
||||
name: Expr,
|
||||
arg: FunctionArgExpr,
|
||||
operator: FunctionArgOperator,
|
||||
},
|
||||
Unnamed(FunctionArgExpr),
|
||||
}
|
||||
|
||||
|
@ -5481,6 +5495,11 @@ impl fmt::Display for FunctionArg {
|
|||
arg,
|
||||
operator,
|
||||
} => write!(f, "{name} {operator} {arg}"),
|
||||
FunctionArg::ExprNamed {
|
||||
name,
|
||||
arg,
|
||||
operator,
|
||||
} => write!(f, "{name} {operator} {arg}"),
|
||||
FunctionArg::Unnamed(unnamed_arg) => write!(f, "{unnamed_arg}"),
|
||||
}
|
||||
}
|
||||
|
@ -5619,7 +5638,10 @@ impl fmt::Display for FunctionArgumentList {
|
|||
}
|
||||
write!(f, "{}", display_comma_separated(&self.args))?;
|
||||
if !self.clauses.is_empty() {
|
||||
write!(f, " {}", display_separated(&self.clauses, " "))?;
|
||||
if !self.args.is_empty() {
|
||||
write!(f, " ")?;
|
||||
}
|
||||
write!(f, "{}", display_separated(&self.clauses, " "))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
@ -5661,6 +5683,11 @@ pub enum FunctionArgumentClause {
|
|||
///
|
||||
/// [`GROUP_CONCAT`]: https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat
|
||||
Separator(Value),
|
||||
/// The json-null-clause to the [`JSON_ARRAY`]/[`JSON_OBJECT`] function in MSSQL.
|
||||
///
|
||||
/// [`JSON_ARRAY`]: <https://learn.microsoft.com/en-us/sql/t-sql/functions/json-array-transact-sql?view=sql-server-ver16>
|
||||
/// [`JSON_OBJECT`]: <https://learn.microsoft.com/en-us/sql/t-sql/functions/json-object-transact-sql?view=sql-server-ver16>
|
||||
JsonNullClause(JsonNullClause),
|
||||
}
|
||||
|
||||
impl fmt::Display for FunctionArgumentClause {
|
||||
|
@ -5676,6 +5703,7 @@ impl fmt::Display for FunctionArgumentClause {
|
|||
FunctionArgumentClause::OnOverflow(on_overflow) => write!(f, "{on_overflow}"),
|
||||
FunctionArgumentClause::Having(bound) => write!(f, "{bound}"),
|
||||
FunctionArgumentClause::Separator(sep) => write!(f, "SEPARATOR {sep}"),
|
||||
FunctionArgumentClause::JsonNullClause(null_clause) => write!(f, "{null_clause}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7564,6 +7592,32 @@ impl fmt::Display for ShowStatementIn {
|
|||
}
|
||||
}
|
||||
|
||||
/// MSSQL's json null clause
|
||||
///
|
||||
/// ```plaintext
|
||||
/// <json_null_clause> ::=
|
||||
/// NULL ON NULL
|
||||
/// | ABSENT ON NULL
|
||||
/// ```
|
||||
///
|
||||
/// <https://learn.microsoft.com/en-us/sql/t-sql/functions/json-object-transact-sql?view=sql-server-ver16#json_null_clause>
|
||||
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
|
||||
pub enum JsonNullClause {
|
||||
NullOnNull,
|
||||
AbsentOnNull,
|
||||
}
|
||||
|
||||
impl Display for JsonNullClause {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self {
|
||||
JsonNullClause::NullOnNull => write!(f, "NULL ON NULL"),
|
||||
JsonNullClause::AbsentOnNull => write!(f, "ABSENT ON NULL"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue