[Research on the paging code source code of Mycat1.6]

What I feel most deeply about using Mycat is: With Mycat, the backend is a Mysql database, and the bottom layer of the database is shielded from the outside world. You don't know what database the backend uses, or even paging. You can pass parameters according to Mysql's Limit syntax. There is no problem. Because the backend PageSQLUtil will automatically wrap the conversion ......


 



 

 

The PageSQLUtil class is currently compatible with ORACLE, SQL_SERVER, DB2, POSTGRESQL, MYSQL paging.

public class PageSQLUtil

{

    public static String convertLimitToNativePageSql(String dbType, String sql,

                                  int offset, int count)

    {

        if (JdbcConstants.ORACLE.equalsIgnoreCase(dbType))

        {

            OracleStatementParser oracleParser = new OracleStatementParser(sql);

            SQLSelectStatement oracleStmt = (SQLSelectStatement) oracleParser.parseStatement();

           return PagerUtils.limit(oracleStmt.getSelect(), JdbcConstants.ORACLE, offset, count);

        } else if (JdbcConstants.SQL_SERVER.equalsIgnoreCase(dbType))

        {

            SQLServerStatementParser oracleParser = new SQLServerStatementParser(sql);

            SQLSelectStatement sqlserverStmt = (SQLSelectStatement) oracleParser.parseStatement();

            SQLSelect select = sqlserverStmt.getSelect();

            SQLOrderBy orderBy=  select.getOrderBy() ;

            if(orderBy==null)

            {

                SQLSelectQuery sqlSelectQuery= select.getQuery();

                if(sqlSelectQuery instanceof SQLServerSelectQueryBlock)

                {

                        SQLServerSelectQueryBlock sqlServerSelectQueryBlock= (SQLServerSelectQueryBlock) sqlSelectQuery;

                    SQLTableSource from=       sqlServerSelectQueryBlock.getFrom();

                    if("limit".equalsIgnoreCase(from.getAlias()))

                    {

                        from.setAlias(null);

                    }

                }

                SQLOrderBy newOrderBy=new SQLOrderBy(new SQLIdentifierExpr("(select 0)"));

                select.setOrderBy(newOrderBy);

            }

           return PagerUtils.limit(select, JdbcConstants.SQL_SERVER, offset, count)  ;

        }

        else if (JdbcConstants.DB2.equalsIgnoreCase(dbType))

        {

            DB2StatementParser db2Parser = new DB2StatementParser(sql);

            SQLSelectStatement db2Stmt = (SQLSelectStatement) db2Parser.parseStatement();

            //Note that the method in the PagerUtils class is not called here, maybe the limitDB2 method in PagerUtils has a bug

            //Because PagerUtils comes from com.alibaba.druid.sql.PagerUtils in the druid-1.0.26 package 

            return limitDB2(db2Stmt.getSelect(), JdbcConstants.DB2, offset, count);

        }  else if (JdbcConstants.POSTGRESQL.equalsIgnoreCase(dbType))

        {

            PGSQLStatementParser pgParser = new PGSQLStatementParser(sql);

            SQLSelectStatement pgStmt = (SQLSelectStatement) pgParser.parseStatement();

            SQLSelect select = pgStmt.getSelect();

            SQLSelectQuery query= select.getQuery();

            if(query instanceof PGSelectQueryBlock)

            {

                PGSelectQueryBlock pgSelectQueryBlock= (PGSelectQueryBlock) query;

                pgSelectQueryBlock.setOffset(null);

                pgSelectQueryBlock.setLimit(null);

 

            }

           return PagerUtils.limit(select, JdbcConstants.POSTGRESQL, offset, count);

        }  else if (JdbcConstants.MYSQL.equalsIgnoreCase(dbType))

        {

            MySqlStatementParser pgParser = new MySqlStatementParser(sql);

            SQLSelectStatement pgStmt = (SQLSelectStatement) pgParser.parseStatement();

            SQLSelect select = pgStmt.getSelect();

            SQLSelectQuery query= select.getQuery();

            if(query instanceof MySqlSelectQueryBlock)

            {

                MySqlSelectQueryBlock pgSelectQueryBlock= (MySqlSelectQueryBlock) query;

                pgSelectQueryBlock.setLimit(null);

            }

            return PagerUtils.limit(select, JdbcConstants.MYSQL, offset, count);

        }

        return sql;

    }

 



 

 



 

Original is not easy, welcome to reward, please look for the correct address, beware of counterfeiting



 

 


Attachment: Experimental code

EXPLAIN select * from dept limit 4,3

truncate table dept

INSERT into dept(uuid,id,address) values(1,1,'北京');

INSERT into dept(uuid,id,address) values(2,2,'上海');

INSERT into dept(uuid,id,address) values(3,3,'深圳');

 

 

INSERT into dept(uuid,id,address) values(4,4,'广州');

INSERT into dept(uuid,id,address) values(5,5,'天津');

INSERT into dept(uuid,id,address) values(6,6,'杭州');

INSERT into dept(uuid,id,address) values(7,7,'南京');

INSERT into dept(uuid,id,address) values(8,8,'济南');

INSERT into dept(uuid,id,address) values(9,9,'重庆');

INSERT into dept(uuid,id,address) values(10,10,'青岛');

INSERT into dept(uuid,id,address) values(11,11,'大连');

INSERT into dept(uuid,id,address) values(12,12,'宁波');

INSERT into dept(uuid,id,address) values(13,13,'厦门');

INSERT into dept(uuid,id,address) values(14,14,'成都');

INSERT into dept(uuid,id,address) values(15,15,'武汉');

INSERT into dept(uuid,id,address) values(16,16,'Harbin');

INSERT into dept(uuid,id,address) values(17,17,'沈阳');

INSERT into dept(uuid,id,address) values(18,18,'西安');

INSERT into dept(uuid,id,address) values(19,19,'长春');

INSERT into dept(uuid,id,address) values(20,20,'长沙');

INSERT into dept(uuid,id,address) values(21,21,'福州');

INSERT into dept(uuid,id,address) values(22,22,'郑州');

INSERT into dept(uuid,id,address) values(23,23,'Shijiazhuang');

INSERT into dept(uuid,id,address) values(24,24,'苏州');

INSERT into dept(uuid,id,address) values(25,25,'佛山');

INSERT into dept(uuid,id,address) values(26,26,'东莞');

INSERT into dept(uuid,id,address) values(27,27,'无锡');

INSERT into dept(uuid,id,address) values(28,28,'烟台');

INSERT into dept(uuid,id,address) values(29,29,'太原');

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326562052&siteId=291194637