Skip to content

Commit 863c4c0

Browse files
committed
fix bug
1 parent fa9382c commit 863c4c0

File tree

2 files changed

+62
-20
lines changed

2 files changed

+62
-20
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/RelationPlanner.java

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -250,18 +250,42 @@ protected RelationPlan visitTable(final Table table, final Void context) {
250250
if (namedQuery.isMaterialized()) {
251251
CteDataStore dataStore = queryContext.getCteDataStore(table);
252252
if (dataStore != null) {
253-
List<Symbol> outputSymbols =
254-
analysis.getOutputDescriptor(table).getAllFields().stream()
255-
.map(symbolAllocator::newSymbol)
256-
.collect(toImmutableList());
253+
List<Symbol> cteSymbols = new ArrayList<>();
254+
Map<String, Symbol> cteSymbolMap = new HashMap<>();
255+
dataStore
256+
.getTableSchema()
257+
.getColumns()
258+
.forEach(
259+
column -> {
260+
Symbol columnSymbol =
261+
symbolAllocator.newSymbol(column.getName(), column.getType());
262+
cteSymbols.add(columnSymbol);
263+
cteSymbolMap.put(column.getName(), columnSymbol);
264+
});
257265

258266
// CTE Scan Node
259-
return new RelationPlan(
260-
new CteScanNode(
261-
idAllocator.genPlanNodeId(), table.getName(), outputSymbols, dataStore),
262-
scope,
263-
outputSymbols,
264-
outerContext);
267+
CteScanNode cteScanNode =
268+
new CteScanNode(idAllocator.genPlanNodeId(), table.getName(), cteSymbols, dataStore);
269+
270+
List<Symbol> outputSymbols = new ArrayList<>();
271+
Assignments.Builder assignments = Assignments.builder();
272+
analysis
273+
.getOutputDescriptor(table)
274+
.getVisibleFields()
275+
.forEach(
276+
field -> {
277+
String columnName = field.getName().orElse("field");
278+
Symbol symbol = cteSymbolMap.get(columnName);
279+
outputSymbols.add(symbol);
280+
assignments.put(symbol, symbol.toSymbolReference());
281+
});
282+
283+
// Project Node
284+
ProjectNode projectNode =
285+
new ProjectNode(
286+
queryContext.getQueryId().genPlanNodeId(), cteScanNode, assignments.build());
287+
288+
return new RelationPlan(projectNode, scope, outputSymbols, outerContext);
265289
}
266290
}
267291

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/CteMaterializer.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
import java.util.Map;
5151
import java.util.Optional;
5252
import java.util.Set;
53+
import java.util.stream.Collectors;
54+
import java.util.stream.IntStream;
5355

5456
public class CteMaterializer {
5557

@@ -143,17 +145,33 @@ public static CteDataStore fetchCteQueryResult(
143145
}
144146

145147
private static TableSchema getTableSchema(DatasetHeader datasetHeader, String cteName) {
146-
List<String> columnNames = datasetHeader.getRespColumns();
147-
List<TSDataType> columnDataTypes = datasetHeader.getRespDataTypes();
148-
final List<ColumnSchema> columnSchemaList = new ArrayList<>();
149-
for (int i = 0; i < columnNames.size(); i++) {
150-
columnSchemaList.add(
151-
new ColumnSchema(
152-
columnNames.get(i),
153-
TypeFactory.getType(columnDataTypes.get(i)),
154-
false,
155-
TsTableColumnCategory.FIELD));
148+
final List<String> columnNames = datasetHeader.getRespColumns();
149+
final List<TSDataType> columnDataTypes = datasetHeader.getRespDataTypes();
150+
if (columnNames.size() != columnDataTypes.size()) {
151+
throw new IoTDBRuntimeException(
152+
"Size of column names and column data types do not match",
153+
TSStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
156154
}
155+
final Map<String, Integer> columnNameIndexMap = datasetHeader.getColumnNameIndexMap();
156+
final List<ColumnSchema> columnSchemaList = new ArrayList<>();
157+
158+
// build name -> type map
159+
Map<String, TSDataType> columnNameDataTypeMap =
160+
IntStream.range(0, columnNames.size())
161+
.boxed()
162+
.collect(Collectors.toMap(columnNames::get, columnDataTypes::get));
163+
164+
// build column schema list of cte table based on columnNameIndexMap
165+
columnNameIndexMap.entrySet().stream()
166+
.sorted(Map.Entry.comparingByValue())
167+
.forEach(
168+
entry ->
169+
columnSchemaList.add(
170+
new ColumnSchema(
171+
entry.getKey(),
172+
TypeFactory.getType(columnNameDataTypeMap.get(entry.getKey())),
173+
false,
174+
TsTableColumnCategory.FIELD)));
157175
return new TableSchema(cteName, columnSchemaList);
158176
}
159177
}

0 commit comments

Comments
 (0)