@@ -57,18 +57,21 @@ class ColumnSelector {
5757 */
5858 explicit ColumnSelector (
5959 const std::shared_ptr<const velox::RowType>& schema,
60- const MetricsLogPtr& log = nullptr )
61- : ColumnSelector(schema, schema, log) {}
60+ const MetricsLogPtr& log = nullptr ,
61+ const bool caseSensitive = true )
62+ : ColumnSelector(schema, schema, log, caseSensitive) {}
6263
6364 explicit ColumnSelector (
6465 const std::shared_ptr<const velox::RowType>& schema,
6566 const std::shared_ptr<const velox::RowType>& contentSchema,
66- MetricsLogPtr log = nullptr )
67+ MetricsLogPtr log = nullptr ,
68+ const bool caseSensitive = true )
6769 : log_{std::move (log)}, schema_{schema}, state_{ReadState::kAll } {
6870 buildNodes (schema, contentSchema);
6971
7072 // no filter, read everything
7173 setReadAll ();
74+ checkSelectColDuplicate (caseSensitive);
7275 }
7376
7477 /* *
@@ -77,18 +80,21 @@ class ColumnSelector {
7780 explicit ColumnSelector (
7881 const std::shared_ptr<const velox::RowType>& schema,
7982 const std::vector<std::string>& names,
80- const MetricsLogPtr& log = nullptr )
81- : ColumnSelector(schema, schema, names, log) {}
83+ const MetricsLogPtr& log = nullptr ,
84+ const bool caseSensitive = true )
85+ : ColumnSelector(schema, schema, names, log, caseSensitive) {}
8286
8387 explicit ColumnSelector (
8488 const std::shared_ptr<const velox::RowType>& schema,
8589 const std::shared_ptr<const velox::RowType>& contentSchema,
8690 const std::vector<std::string>& names,
87- MetricsLogPtr log = nullptr )
91+ MetricsLogPtr log = nullptr ,
92+ const bool caseSensitive = true )
8893 : log_{std::move (log)},
8994 schema_{schema},
9095 state_{names.empty () ? ReadState::kAll : ReadState::kPartial } {
91- acceptFilter (schema, contentSchema, names);
96+ acceptFilter (schema, contentSchema, names, false );
97+ checkSelectColDuplicate (caseSensitive);
9298 }
9399
94100 /* *
@@ -98,19 +104,23 @@ class ColumnSelector {
98104 const std::shared_ptr<const velox::RowType>& schema,
99105 const std::vector<uint64_t >& ids,
100106 const bool filterByNodes = false ,
101- const MetricsLogPtr& log = nullptr )
102- : ColumnSelector(schema, schema, ids, filterByNodes, log) {}
107+ const MetricsLogPtr& log = nullptr ,
108+ const bool caseSensitive = true )
109+ : ColumnSelector(schema, schema, ids, filterByNodes, log, caseSensitive) {
110+ }
103111
104112 explicit ColumnSelector (
105113 const std::shared_ptr<const velox::RowType>& schema,
106114 const std::shared_ptr<const velox::RowType>& contentSchema,
107115 const std::vector<uint64_t >& ids,
108116 const bool filterByNodes = false ,
109- MetricsLogPtr log = nullptr )
117+ MetricsLogPtr log = nullptr ,
118+ const bool caseSensitive = true )
110119 : log_{std::move (log)},
111120 schema_{schema},
112121 state_{ids.empty () ? ReadState::kAll : ReadState::kPartial } {
113122 acceptFilter (schema, contentSchema, ids, filterByNodes);
123+ checkSelectColDuplicate (caseSensitive);
114124 }
115125
116126 // set a specific node to read state
@@ -301,6 +311,28 @@ class ColumnSelector {
301311 // get node ID list to be read
302312 std::vector<uint64_t > getNodeFilter () const ;
303313
314+ void checkSelectColDuplicate (bool caseSensitive) {
315+ if (caseSensitive) {
316+ return ;
317+ }
318+ std::unordered_map<std::string, int > names;
319+ for (auto node : nodes_) {
320+ auto name = node->getNode ().name ;
321+ if (names.find (name) == names.end ()) {
322+ names[name] = 1 ;
323+ } else {
324+ names[name] = names[name] + 1 ;
325+ }
326+ for (auto filter : filter_) {
327+ if (names[filter.name ] > 1 ) {
328+ VELOX_USER_FAIL (
329+ " Found duplicate field(s) {} in case-insensitive mode" ,
330+ filter.name );
331+ }
332+ }
333+ }
334+ }
335+
304336 // accept filter
305337 template <typename T>
306338 void acceptFilter (
0 commit comments