1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.binder.engine;
19
20 import lombok.RequiredArgsConstructor;
21 import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
22 import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContextFactory;
23 import org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementBinder;
24 import org.apache.shardingsphere.infra.binder.statement.dml.DeleteStatementBinder;
25 import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementBinder;
26 import org.apache.shardingsphere.infra.binder.statement.dml.MergeStatementBinder;
27 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementBinder;
28 import org.apache.shardingsphere.infra.binder.statement.dml.UpdateStatementBinder;
29 import org.apache.shardingsphere.infra.hint.HintValueContext;
30 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
31 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
32 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement;
33 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
34 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
35 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
36 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.MergeStatement;
37 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
38 import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
39 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.opengauss.ddl.OpenGaussCursorStatement;
40
41 import java.util.List;
42
43
44
45
46 @RequiredArgsConstructor
47 public final class SQLBindEngine {
48
49 private final ShardingSphereMetaData metaData;
50
51 private final String defaultDatabaseName;
52
53 private final HintValueContext hintValueContext;
54
55
56
57
58
59
60
61
62 public SQLStatementContext bind(final SQLStatement sqlStatement, final List<Object> params) {
63 SQLStatement buoundedSQLStatement = bind(sqlStatement, metaData, defaultDatabaseName);
64 return SQLStatementContextFactory.newInstance(metaData, params, buoundedSQLStatement, defaultDatabaseName);
65 }
66
67 private SQLStatement bind(final SQLStatement statement, final ShardingSphereMetaData metaData, final String defaultDatabaseName) {
68 if (hintValueContext.findHintDataSourceName().isPresent()) {
69 return statement;
70 }
71 if (statement instanceof DMLStatement) {
72 return bindDMLStatement(statement, metaData, defaultDatabaseName);
73 }
74 if (statement instanceof DDLStatement) {
75 return bindDDLStatement(statement, metaData, defaultDatabaseName);
76 }
77 return statement;
78 }
79
80 private static SQLStatement bindDMLStatement(final SQLStatement statement, final ShardingSphereMetaData metaData, final String defaultDatabaseName) {
81 if (statement instanceof SelectStatement) {
82 return new SelectStatementBinder().bind((SelectStatement) statement, metaData, defaultDatabaseName);
83 }
84 if (statement instanceof InsertStatement) {
85 return new InsertStatementBinder().bind((InsertStatement) statement, metaData, defaultDatabaseName);
86 }
87 if (statement instanceof UpdateStatement) {
88 return new UpdateStatementBinder().bind((UpdateStatement) statement, metaData, defaultDatabaseName);
89 }
90 if (statement instanceof DeleteStatement) {
91 return new DeleteStatementBinder().bind((DeleteStatement) statement, metaData, defaultDatabaseName);
92 }
93 if (statement instanceof MergeStatement) {
94 return new MergeStatementBinder().bind((MergeStatement) statement, metaData, defaultDatabaseName);
95 }
96 return statement;
97 }
98
99 private static SQLStatement bindDDLStatement(final SQLStatement statement, final ShardingSphereMetaData metaData, final String defaultDatabaseName) {
100 if (statement instanceof OpenGaussCursorStatement) {
101 return new CursorStatementBinder().bind((OpenGaussCursorStatement) statement, metaData, defaultDatabaseName);
102 }
103 return statement;
104 }
105 }