|
18 | 18 | //! DFSchema is an extended schema struct that DataFusion uses to provide support for
|
19 | 19 | //! fields with optional relation names.
|
20 | 20 |
|
21 |
| -use std::collections::{BTreeSet, HashMap}; |
| 21 | +use std::collections::{BTreeSet, HashMap, HashSet}; |
22 | 22 | use std::convert::TryFrom;
|
23 | 23 | use std::fmt::{Display, Formatter};
|
24 | 24 | use std::hash::Hash;
|
@@ -218,17 +218,25 @@ impl DFSchema {
|
218 | 218 | if other_schema.fields.is_empty() {
|
219 | 219 | return;
|
220 | 220 | }
|
| 221 | + |
| 222 | + let self_fields: HashSet<&DFField> = self.fields.iter().collect(); |
| 223 | + let self_unqualified_names: HashSet<&str> = |
| 224 | + self.fields.iter().map(|x| x.name().as_str()).collect(); |
| 225 | + |
| 226 | + let mut fields_to_add = vec![]; |
| 227 | + |
221 | 228 | for field in other_schema.fields() {
|
222 | 229 | // skip duplicate columns
|
223 | 230 | let duplicated_field = match field.qualifier() {
|
224 |
| - Some(q) => self.has_column_with_qualified_name(q, field.name()), |
| 231 | + Some(_) => self_fields.contains(field), |
225 | 232 | // for unqualified columns, check as unqualified name
|
226 |
| - None => self.has_column_with_unqualified_name(field.name()), |
| 233 | + None => self_unqualified_names.contains(field.name().as_str()), |
227 | 234 | };
|
228 | 235 | if !duplicated_field {
|
229 |
| - self.fields.push(field.clone()); |
| 236 | + fields_to_add.push(field.clone()); |
230 | 237 | }
|
231 | 238 | }
|
| 239 | + self.fields.extend(fields_to_add); |
232 | 240 | self.metadata.extend(other_schema.metadata.clone())
|
233 | 241 | }
|
234 | 242 |
|
|
0 commit comments