@Override public RouteResultset routeToMultiNode( SchemaConfig schema, boolean isSelect, boolean cache, QueryTreeNode ast, RouteResultset rrs, Collection<String> dataNodes, String stmt) throws SQLSyntaxErrorException { if (isSelect) { String sql = SelectSQLAnalyser.analyseMergeInf(rrs, ast, true, schema.getDefaultMaxLimit()); if (sql != null) { stmt = sql; } } RouteResultsetNode[] nodes = new RouteResultsetNode[dataNodes.size()]; int i = 0; for (String dataNode : dataNodes) { nodes[i++] = new RouteResultsetNode(dataNode, rrs.getSqlType(), stmt); } rrs.setCacheAble(cache); rrs.setNodes(nodes); return rrs; }
private static String addSQLLmit( SchemaConfig schema, RouteResultset rrs, QueryTreeNode ast, String sql) throws SQLSyntaxErrorException { if (!rrs.hasPrimaryKeyToCache() && schema.getDefaultMaxLimit() != -1 && ast instanceof CursorNode && ((CursorNode) ast).getFetchFirstClause() == null) { String newstmt = SelectSQLAnalyser.addLimitCondtionForSelectSQL( rrs, (CursorNode) ast, schema.getDefaultMaxLimit()); if (newstmt != null) { return newstmt; } } return sql; }
private RouteResultset routeSelect( SchemaConfig schema, QueryTreeNode ast, RouteResultset rrs, String stmt, LayerCachePool cachePool) throws SQLNonTransientException { ResultSetNode rsNode = ((CursorNode) ast).getResultSetNode(); if (rsNode instanceof SelectNode) { if (((SelectNode) rsNode).getFromList().isEmpty()) { // if it is a sql about system info, such as select charset etc. return RouterUtil.routeToSingleNode(rrs, schema.getRandomDataNode(), stmt); } } // standard SELECT operation SelectParseInf parsInf = new SelectParseInf(); parsInf.ctx = new ShardingParseInfo(); SelectSQLAnalyser.analyse(parsInf, ast); return tryRouteForTables(ast, true, rrs, schema, parsInf.ctx, stmt, cachePool); }