private boolean containShardKeyIn(SQLExpr expr) { if (expr instanceof SQLIdentifierExpr) { String colName = ((SQLIdentifierExpr) expr).getSimpleName(); return containShardKeyIn(colName); } else if (expr instanceof SQLListExpr) { List<SQLExpr> identifiers = ((SQLListExpr) expr).getItems(); if (identifiers != null) { for (SQLExpr identifier : identifiers) { String colName = ((SQLIdentifierExpr) identifier).getSimpleName(); if (containShardKeyIn(colName)) { return true; } } } } return false; }
@Override public boolean visit(SQLPropertyExpr x) { String name = x.getSimpleName(); SQLIdentifierExpr owner = (SQLIdentifierExpr) x.getOwner(); String simpleName = owner.getSimpleName(); boolean hasQuote = simpleName.charAt(0) == '`'; String tableName = hasQuote ? parseTableName(simpleName) : simpleName; String finalTable = tableMapping.get(tableName); if (finalTable != null) { if (hasQuote) { print0(String.format(PROPERTY_QUOT_NAME_PATTERN, finalTable, name)); } else { print0(String.format(PROPERTY_NAME_PATTERN, finalTable, name)); } } else { print0(String.format(PROPERTY_NAME_PATTERN, simpleName, name)); } return false; }
private static String parseStringValue(SQLExpr valueExpr) { String strValue = ""; if (valueExpr instanceof SQLIdentifierExpr) { SQLIdentifierExpr value = (SQLIdentifierExpr) valueExpr; strValue = StringUtil.removeBackQuote(value.getSimpleName().toLowerCase()); } else if (valueExpr instanceof SQLCharExpr) { SQLCharExpr value = (SQLCharExpr) valueExpr; strValue = value.getText().toLowerCase(); } else if (valueExpr instanceof SQLIntegerExpr) { SQLIntegerExpr value = (SQLIntegerExpr) valueExpr; strValue = value.getNumber().toString(); } else if (valueExpr instanceof SQLDefaultExpr || valueExpr instanceof SQLNullExpr) { strValue = valueExpr.toString(); } return strValue; }
@Override public void endVisit(SQLIdentifierExpr x) { item = new ItemField(null, null, StringUtil.removeBackQuote(x.getSimpleName())); }
/** */ private void sharingTableCheck(MySqlCreateTableStatement createStmt) throws SQLNonTransientException { //ALLOW InnoDB ONLY SQLObject engine = createStmt.getTableOptions().get("ENGINE"); if (engine != null) { String strEngine; if (engine instanceof SQLCharExpr) { strEngine = ((SQLCharExpr) engine).getText(); } else if (engine instanceof SQLIdentifierExpr) { strEngine = ((SQLIdentifierExpr) engine).getSimpleName(); } else { strEngine = engine.toString(); } if (!"InnoDB".equalsIgnoreCase(strEngine)) { String msg = "create table only can use ENGINE InnoDB,others not supported:" + createStmt; LOGGER.info(msg); throw new SQLNonTransientException(msg); } } //DISABLE DATA DIRECTORY if (createStmt.getTableOptions().get("DATA DIRECTORY") != null) { String msg = "create table with DATA DIRECTORY not supported:" + createStmt; LOGGER.info(msg); throw new SQLNonTransientException(msg); } } }
private static String parseVariablesValue(SQLExpr valueExpr) { String strValue; if (valueExpr instanceof SQLIdentifierExpr) { SQLIdentifierExpr value = (SQLIdentifierExpr) valueExpr; strValue = "'" + StringUtil.removeBackQuote(value.getSimpleName().toLowerCase()) + "'"; } else if (valueExpr instanceof SQLCharExpr) { SQLCharExpr value = (SQLCharExpr) valueExpr; strValue = "'" + value.getText().toLowerCase() + "'"; } else if (valueExpr instanceof SQLIntegerExpr) { SQLIntegerExpr value = (SQLIntegerExpr) valueExpr; strValue = value.getNumber().toString(); } else if (valueExpr instanceof SQLNumberExpr) { SQLNumberExpr value = (SQLNumberExpr) valueExpr; strValue = value.getNumber().toString(); } else if (valueExpr instanceof SQLBooleanExpr) { SQLBooleanExpr value = (SQLBooleanExpr) valueExpr; strValue = String.valueOf(value.getValue()); } else if (valueExpr instanceof SQLDefaultExpr || valueExpr instanceof SQLNullExpr) { strValue = valueExpr.toString(); } else { strValue = SQLUtils.toMySqlString(valueExpr); } return strValue; }
@Override public void endVisit(SQLPropertyExpr x) { String dbName = null; String tableName; if (x.getOwner() instanceof SQLPropertyExpr) { SQLPropertyExpr tableInfo = (SQLPropertyExpr) x.getOwner(); dbName = ((SQLIdentifierExpr) tableInfo.getOwner()).getSimpleName(); tableName = tableInfo.getSimpleName(); } else { tableName = ((SQLIdentifierExpr) x.getOwner()).getSimpleName(); } item = new ItemField(dbName, StringUtil.removeBackQuote(tableName), StringUtil.removeBackQuote(x.getSimpleName())); }
private void parseGroupCommon(RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, TableConfig tc) { if (mysqlSelectQuery.getGroupBy() != null) { SQLSelectGroupByClause groupBy = mysqlSelectQuery.getGroupBy(); boolean hasPartitionColumn = false; for (SQLExpr groupByItem : groupBy.getItems()) { if (isNeedOptimizer(groupByItem)) { rrs.setNeedOptimizer(true); return; } else if (groupByItem instanceof SQLIdentifierExpr) { SQLIdentifierExpr item = (SQLIdentifierExpr) groupByItem; if (item.getSimpleName().equalsIgnoreCase(tc.getPartitionColumn())) { hasPartitionColumn = true; } } else if (groupByItem instanceof SQLPropertyExpr) { SQLPropertyExpr item = (SQLPropertyExpr) groupByItem; if (item.getSimpleName().equalsIgnoreCase(tc.getPartitionColumn())) { hasPartitionColumn = true; } } } if (groupBy.getItems().size() > 0 && !hasPartitionColumn) { rrs.setNeedOptimizer(true); return; } if (groupBy.getItems().size() == 0 && groupBy.getHaving() != null) { // only having filter need optimizer rrs.setNeedOptimizer(true); } } }
case "TIMESTAMPADD": SQLIdentifierExpr addUnit = (SQLIdentifierExpr) x.getParameters().get(0); item = new ItemDateAddInterval(args.get(2), args.get(1), SQLIntervalUnit.valueOf(addUnit.getSimpleName()), false); break; case "TIMESTAMPDIFF": SQLIdentifierExpr diffUnit = (SQLIdentifierExpr) x.getParameters().get(0); item = new ItemFuncTimestampDiff(args.get(1), args.get(2), SQLIntervalUnit.valueOf(diffUnit.getSimpleName())); break; case "VAR_SAMP":
if (itemExpr instanceof SQLIdentifierExpr) { SQLIdentifierExpr item = (SQLIdentifierExpr) itemExpr; if (item.getSimpleName().equalsIgnoreCase(tc.getPartitionColumn())) { hasPartitionColumn = true;