You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by if...@apache.org on 2025/06/25 10:22:04 UTC
(datafusion-sqlparser-rs) branch main updated: Fix `impl Ord for Ident` (#1893)
This is an automated email from the ASF dual-hosted git repository.
iffyio pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git
The following commit(s) were added to refs/heads/main by this push:
new b2ab0061 Fix `impl Ord for Ident` (#1893)
b2ab0061 is described below
commit b2ab0061c172aa55e06ece592309a96083d2220d
Author: Elia Perantoni <ep...@wayfare.ai>
AuthorDate: Wed Jun 25 12:21:59 2025 +0200
Fix `impl Ord for Ident` (#1893)
---
src/ast/mod.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/src/ast/mod.rs b/src/ast/mod.rs
index 17464f4a..ef0c4dc9 100644
--- a/src/ast/mod.rs
+++ b/src/ast/mod.rs
@@ -28,6 +28,7 @@ use helpers::{
stmt_data_loading::{FileStagingCommand, StageLoadSelectItemKind},
};
+use core::cmp::Ordering;
use core::ops::Deref;
use core::{
fmt::{self, Display},
@@ -172,7 +173,7 @@ fn format_statement_list(f: &mut fmt::Formatter, statements: &[Statement]) -> fm
}
/// An identifier, decomposed into its value or character data and the quote style.
-#[derive(Debug, Clone, PartialOrd, Ord)]
+#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
pub struct Ident {
@@ -214,6 +215,35 @@ impl core::hash::Hash for Ident {
impl Eq for Ident {}
+impl PartialOrd for Ident {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ Some(self.cmp(other))
+ }
+}
+
+impl Ord for Ident {
+ fn cmp(&self, other: &Self) -> Ordering {
+ let Ident {
+ value,
+ quote_style,
+ // exhaustiveness check; we ignore spans in ordering
+ span: _,
+ } = self;
+
+ let Ident {
+ value: other_value,
+ quote_style: other_quote_style,
+ // exhaustiveness check; we ignore spans in ordering
+ span: _,
+ } = other;
+
+ // First compare by value, then by quote_style
+ value
+ .cmp(other_value)
+ .then_with(|| quote_style.cmp(other_quote_style))
+ }
+}
+
impl Ident {
/// Create a new identifier with the given value and no quotes and an empty span.
pub fn new<S>(value: S) -> Self
@@ -4214,7 +4244,7 @@ pub enum Statement {
/// ```sql
/// NOTIFY channel [ , payload ]
/// ```
- /// send a notification event together with an optional “payload” string to channel
+ /// send a notification event together with an optional "payload" string to channel
///
/// See Postgres <https://www.postgresql.org/docs/current/sql-notify.html>
NOTIFY {
@@ -9771,6 +9801,8 @@ impl fmt::Display for NullInclusion {
#[cfg(test)]
mod tests {
+ use crate::tokenizer::Location;
+
use super::*;
#[test]
@@ -10066,4 +10098,16 @@ mod tests {
test_steps(OneOrManyWithParens::Many(vec![2]), vec![2], 3);
test_steps(OneOrManyWithParens::Many(vec![3, 4]), vec![3, 4], 4);
}
+
+ // Tests that the position in the code of an `Ident` does not affect its
+ // ordering.
+ #[test]
+ fn test_ident_ord() {
+ let mut a = Ident::with_span(Span::new(Location::new(1, 1), Location::new(1, 1)), "a");
+ let mut b = Ident::with_span(Span::new(Location::new(2, 2), Location::new(2, 2)), "b");
+
+ assert!(a < b);
+ std::mem::swap(&mut a.span, &mut b.span);
+ assert!(a < b);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org