1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.proxy.frontend.mysql.command.query.binary.prepare;
19
20 import lombok.AccessLevel;
21 import lombok.NoArgsConstructor;
22 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
23 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
24 import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
25 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.InsertValuesSegment;
26 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
27 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
28 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
29 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
30
31 import java.util.ArrayList;
32 import java.util.Collections;
33 import java.util.List;
34 import java.util.ListIterator;
35 import java.util.stream.Collectors;
36
37
38
39
40 @NoArgsConstructor(access = AccessLevel.PRIVATE)
41 public final class MySQLComStmtPrepareParameterMarkerExtractor {
42
43
44
45
46
47
48
49
50
51 public static List<ShardingSphereColumn> findColumnsOfParameterMarkers(final SQLStatement sqlStatement, final ShardingSphereSchema schema) {
52 return sqlStatement instanceof InsertStatement ? findColumnsOfParameterMarkersForInsert((InsertStatement) sqlStatement, schema) : Collections.emptyList();
53 }
54
55 private static List<ShardingSphereColumn> findColumnsOfParameterMarkersForInsert(final InsertStatement insertStatement, final ShardingSphereSchema schema) {
56 ShardingSphereTable table = schema.getTable(insertStatement.getTable().getTableName().getIdentifier().getValue());
57 List<String> columnNamesOfInsert = getColumnNamesOfInsertStatement(insertStatement, table);
58 List<ShardingSphereColumn> result = new ArrayList<>(insertStatement.getParameterMarkerSegments().size());
59 for (InsertValuesSegment each : insertStatement.getValues()) {
60 ListIterator<ExpressionSegment> listIterator = each.getValues().listIterator();
61 for (int columnIndex = listIterator.nextIndex(); listIterator.hasNext(); columnIndex = listIterator.nextIndex()) {
62 ExpressionSegment value = listIterator.next();
63 if (!(value instanceof ParameterMarkerExpressionSegment)) {
64 continue;
65 }
66 String columnName = columnNamesOfInsert.get(columnIndex);
67 ShardingSphereColumn column = table.getColumn(columnName);
68 result.add(column);
69 }
70 }
71 return result;
72 }
73
74 private static List<String> getColumnNamesOfInsertStatement(final InsertStatement insertStatement, final ShardingSphereTable table) {
75 return insertStatement.getColumns().isEmpty() ? table.getColumnNames() : insertStatement.getColumns().stream().map(each -> each.getIdentifier().getValue()).collect(Collectors.toList());
76 }
77 }