public SQLInsertStatement parseInsert() { MySqlInsertStatement stmt = new MySqlInsertStatement(); stmt.setLowPriority(true); lexer.nextToken(); continue; stmt.setDelayed(true); lexer.nextToken(); continue; stmt.setHighPriority(true); lexer.nextToken(); continue; stmt.setIgnore(true); lexer.nextToken(); continue; stmt.setRollbackOnFail(true); lexer.nextToken(); continue; stmt.setTableName(tableName); stmt.getTableSource().addAfterComment(comment); stmt.setAlias(lexer.stringVal()); lexer.nextToken();
@Override public boolean visit(MySqlInsertStatement x) { List<SQLCommentHint> headHints = x.getHeadHintsDirect(); if (headHints != null) { for (SQLCommentHint hint : headHints) { if (x.isLowPriority()) { print0(ucase ? "LOW_PRIORITY " : "low_priority "); if (x.isDelayed()) { print0(ucase ? "DELAYED " : "delayed "); if (x.isHighPriority()) { print0(ucase ? "HIGH_PRIORITY " : "high_priority "); if (x.isIgnore()) { print0(ucase ? "IGNORE " : "ignore "); if (x.isRollbackOnFail()) { print0(ucase ? "ROLLBACK_ON_FAIL " : "rollback_on_fail "); SQLExprTableSource tableSource = x.getTableSource(); if (tableSource.getClass() == SQLExprTableSource.class) { visit(tableSource); String columnsString = x.getColumnsString(); if (columnsString != null) { if (!isEnabled(VisitorFeature.OutputSkipInsertColumnsString)) { List<SQLExpr> columns = x.getColumns();
protected void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { this.acceptChild(visitor, getTableSource()); this.acceptChild(visitor, getColumns()); this.acceptChild(visitor, getValuesList()); this.acceptChild(visitor, getQuery()); this.acceptChild(visitor, getDuplicateKeyUpdate()); } visitor.endVisit(this); }
@Override public boolean visit(MySqlInsertStatement x) { if (repository != null && x.getParent() == null) { repository.resolve(x); } setMode(x, Mode.Insert); TableStat stat = getTableStat(x.getTableSource()); if (stat != null) { stat.incrementInsertCount(); } accept(x.getColumns()); accept(x.getValuesList()); accept(x.getQuery()); accept(x.getDuplicateKeyUpdate()); return false; }
if (insert.isIgnore()) { sb.append("ignore "); sb.append(schemaInfo.getTable()); List<SQLExpr> columns = insert.getColumns(); List<ValuesClause> vcl = insert.getValuesList(); if (vcl != null && vcl.size() > 1) { // batch insert for (int j = 0; j < vcl.size(); j++) { List<SQLExpr> values = insert.getValues().getValues(); appendValues(tableKey, values, sb, autoIncrement, idxGlobal, colSize); List<SQLExpr> dku = insert.getDuplicateKeyUpdate(); if (dku != null && dku.size() > 0) { genDuplicate(isGlobalCheck, sb, dku);
public boolean visit(MySqlInsertStatement x) { String tableName = x.getTableName().getSimpleName(); if (!ruleSet.relativeTo(tableName)) return false; val sqlFieldIndexes = Lists.<SqlFieldIndex>newArrayList(); for (int i = 0, ii = x.getColumns().size(); i < ii; ++i) { val valueExpr = x.getValues().getValues().get(i); valueExpr.accept(this); val columnExpr = x.getColumns().get(i); if (!(columnExpr instanceof SQLIdentifierExpr)) continue; String columnName = ((SQLIdentifierExpr) columnExpr).getName(); if (!ruleSet.relativeTo(tableName, columnName)) continue; if (!(valueExpr instanceof SQLVariantRefExpr)) continue; val index = new SqlFieldIndex(tableName, columnName, variantIndex - 1); sqlFieldIndexes.add(index); } this.sqlFieldIndexes = sqlFieldIndexes.toArray(new SqlFieldIndex[0]); return false; } }
private static Collection<Object> evalInsert(SQLParsedResult parseResult, String column, List<Object> params, boolean isBatchInsert) { MySqlInsertStatement stmt = (MySqlInsertStatement) parseResult.getStmt(); List<SQLExpr> columns = stmt.getColumns(); List<SQLInsertStatement.ValuesClause> valuesList = stmt.getValuesList(); if (isBatchInsert) { List<Object> evalList = new LinkedList<Object>(); parseBatchValueList(evalList, params, columns, valuesList, column); return evalList; } else { // use the first value in the values Set<Object> evalSet = new LinkedHashSet<Object>(); parseValueList(evalSet, params, columns, valuesList, column); return evalSet; } }
private boolean isInsertHasSlot(String sql) { MySqlStatementParser parser = new MySqlStatementParser(sql); MySqlInsertStatement insertStatement = (MySqlInsertStatement) parser.parseStatement(); List<SQLExpr> cc = insertStatement.getColumns(); for (SQLExpr sqlExpr : cc) { SQLIdentifierExpr c = (SQLIdentifierExpr) sqlExpr; if ("_slot".equalsIgnoreCase(c.getName()) && cc.size() == insertStatement.getValues().getValues().size()) return true; } return false; }
CalculateUnit unit = new CalculateUnit(); boolean isFind = false; for(int i = 0; i < insertStmt.getColumns().size(); i++) { String column = StringUtil.removeBackquote(insertStmt.getColumns().get(i).toString()); if (StringUtil.contains(partitionColumn, column)){ SQLExpr valueExpr = insertStmt.getValues().getValues().get(i); Object value = SQLEvalVisitorUtils.eval(JdbcUtils.MYSQL, valueExpr, parameters, false); if (!SQLEvalVisitor.EVAL_VALUE_NULL.equals(value)){ if(insertStmt.getDuplicateKeyUpdate() != null) { List<SQLExpr> updateList = insertStmt.getDuplicateKeyUpdate(); for(SQLExpr expr : updateList) { SQLBinaryOpExpr opExpr = (SQLBinaryOpExpr)expr;
@Override public List<String> getInsertColumns() { List<SQLExpr> columnSQLExprs = ast.getColumns(); if (columnSQLExprs.size() == 0) { // INSERT INTO ta VALUES (...), without fields clarified return null; } List<String> list = new ArrayList<>(columnSQLExprs.size()); for (SQLExpr expr : columnSQLExprs) { if (expr instanceof SQLIdentifierExpr) { list.add(((SQLIdentifierExpr)expr).getName()); } else { throw new SQLParsingException("Unknown SQLExpr: " + expr.getClass() + " " + expr); } } return list; }
@Override public boolean visit(final MySqlInsertStatement x) { SQLName expr = x.getTableName(); String tableName = expr.toString(); String schema = null; if (expr instanceof SQLPropertyExpr) { SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr; tableName = propertyExpr.getSimpleName(); schema = propertyExpr.getOwner().toString(); } tableName = SQLUtil.getExactlyValue(tableName); getParsedResult().setTable(new Table(tableName, schema, x.getAlias())); List<SQLExpr> columns = x.getColumns(); for (SQLExpr sqlExpr : columns) { String columnName = SQLUtil.getExactlyValue(sqlExpr.toString()); Column column = new Column(columnName, tableName); getParsedResult().getColumns().add(column); } return super.visit(x); }
@Override public List<List<Object>> getInsertRows() { List<SQLInsertStatement.ValuesClause> valuesClauses = ast.getValuesList(); List<List<Object>> rows = new ArrayList<>(valuesClauses.size()); for (SQLInsertStatement.ValuesClause valuesClause : valuesClauses) { List<SQLExpr> exprs = valuesClause.getValues(); List<Object> row = new ArrayList<>(exprs.size()); rows.add(row); for (SQLExpr expr : valuesClause.getValues()) { if (expr instanceof SQLValuableExpr) { row.add(((SQLValuableExpr)expr).getValue()); } else { throw new SQLParsingException("Unknown SQLExpr: " + expr.getClass() + " " + expr); } } } return rows; } }
/** * 是否为批量插入:insert into ...values (),()...或 insert into ...select..... * @param insertStmt * @return */ private boolean isMultiInsert(MySqlInsertStatement insertStmt) { return (insertStmt.getValuesList() != null && insertStmt.getValuesList().size() > 1) || insertStmt.getQuery() != null; }
SQLExpr valueExpr = insertStmt.getValues().getValues().get(shardingColIndex); String shardingValue = shardingValueToSting(valueExpr); TableConfig tableConfig = schemaInfo.getSchemaConfig().getTables().get(schemaInfo.getTable()); if (insertStmt.getDuplicateKeyUpdate() != null) { List<SQLExpr> updateList = insertStmt.getDuplicateKeyUpdate(); for (SQLExpr expr : updateList) { SQLBinaryOpExpr opExpr = (SQLBinaryOpExpr) expr;
@Override public String getTableName() { StringBuffer sb = new StringBuffer(); MySqlOutputVisitor visitor = new MySqlOutputVisitor(sb) { @Override public boolean visit(SQLExprTableSource x) { printTableSourceExpr(x.getExpr()); return false; } }; visitor.visit(ast.getTableSource()); return sb.toString(); }
SQLExprTableSource tableSource = insert.getTableSource(); SchemaInfo schemaInfo = SchemaUtil.getSchemaInfo(sc.getUser(), schemaName, tableSource); if (!ServerPrivileges.checkPrivilege(sc, schemaInfo.getSchema(), schemaInfo.getTable(), CheckType.INSERT)) { if (insert.getQuery() != null) {
@Override public boolean visit(MySqlInsertStatement x) { SQLName sqlName = x.getTableName(); if (sqlName != null) { currentTable = sqlName.toString(); } return false; }
final String joinKeyVal = insertStmt.getValues().getValues().get(joinKeyIndex).toString(); String realVal = StringUtil.removeApostrophe(joinKeyVal); final String sql = RouterUtil.removeSchema(statementToString(insertStmt), schemaInfo.getSchema());
private boolean parserNoSharding(ServerConnection sc, String contextSchema, SchemaInfo schemaInfo, RouteResultset rrs, MySqlInsertStatement insert) throws SQLException { String noShardingNode = RouterUtil.isNoSharding(schemaInfo.getSchemaConfig(), schemaInfo.getTable()); if (noShardingNode != null) { StringPtr noShardingNodePr = new StringPtr(noShardingNode); Set<String> schemas = new HashSet<>(); if (insert.getQuery() != null) { SQLSelectStatement selectStmt = new SQLSelectStatement(insert.getQuery()); if (!SchemaUtil.isNoSharding(sc, insert.getQuery().getQuery(), insert, selectStmt, contextSchema, schemas, noShardingNodePr)) { return false; } } routeToNoSharding(schemaInfo.getSchemaConfig(), rrs, schemas, noShardingNodePr); return true; } return false; }
protected void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { this.acceptChild(visitor, getTableSource()); this.acceptChild(visitor, getColumns()); this.acceptChild(visitor, getValuesList()); this.acceptChild(visitor, getQuery()); this.acceptChild(visitor, getDuplicateKeyUpdate()); } visitor.endVisit(this); }