当前使用版本(使用版本是3.1.2)

该问题是怎么引起的?

IPage分页,会在原先的sql语句外面,嵌套一个with as语句。如果原先写的sql语句里面有with as,双重嵌套直接报错了。我写了sql语句是没错了,验证过了,去掉分页就可以,加上分页,就报了这个with as 嵌套错误。

重现步骤

1585014160(1)

报错信息

SQL: WITH selectTemp AS (SELECT TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as row_number, WITH CUST_TABLE AS ( SELECT TC.CUST_ID FROM EFCRM..TCUSTOMERS TC, TBENIFITOR TB, TPRODUCT TP WHERE TP.PRODUCT_ID = TB.PRODUCT_ID AND TB.CUST_ID = TC.CUST_ID GROUP BY TC.CUST_ID ) SELECT TC.CUST_ID, TC.CUST_NO, TC.CUST_NAME, TC.BIRTHDAY, TC.CARD_TYPE, TC.CARD_TYPE_NAME, TC.CARD_ID, TC.CARD_VALID_DATE, TC.SEX, TC.COUNTRY, TD.TYPE_CONTENT AS COUNTRY_NAME, TC.VOC_TYPE_NAME, TC.MOBILE, TC.E_MAIL, TC.CUST_TYPE, TC.POST_ADDRESS, TC.CUST_SOURCE, TC.CUST_SOURCE_NAME, TC.RECOMMENDED, TC.SERVICE_MAN, TM.MANAGERNAME AS SERVICE_MAN_NAME, TC.STATUS, TC.STATUS_NAME , TC.IMAGEIDENTIFICATION, TC.CONTACT_MAN, TC.LEGAL_MAN, TC.LEGAL_ADDRESS FROM EFCRM..TCUSTOMERS TC, CUST_TABLE CU, EFCRM..TCUSTMANAGERS TM, TDICTPARAM TD WHERE TC.SERVICE_MAN = TM.MANAGERID AND TD.TYPE_ID = 9997 AND TD.TYPE_VALUE = TC.COUNTRY AND TC.CUST_ID = CU.CUST_ID) SELECT * FROM selectTemp WHERE row_number BETWEEN 1 AND 2 ORDER BY row_number

Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'ABLE AS (

    SELECT
      ', expect RPAREN, actual AS pos 128, line 1, column 126, token AS : WITH selectTemp AS (SELECT TOP 100 PERCENT  ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__, WITH CUST_TABLE AS (
    SELECT
        TC.CUST_ID
    FROM
        EFCRM..TCUSTOMERS TC,
        TBENIFITOR TB,
        TPRODUCT TP
    WHERE
        TP.PRODUCT_ID = TB.PRODUCT_ID


        AND TB.CUST_ID = TC.CUST_ID
    GROUP BY
        TC.CUST_ID
        ) SELECT TC.CUST_ID,
        TC.CUST_NO,
        TC.CUST_NAME,
        TC.BIRTHDAY,
        TC.CARD_TYPE,
        TC.CARD_TYPE_NAME,
        TC.CARD_ID,
        TC.CARD_VALID_DATE,
        TC.SEX,
        TC.COUNTRY,
        TD.TYPE_CONTENT AS COUNTRY_NAME,
        TC.VOC_TYPE_NAME,
        TC.MOBILE,
        TC.E_MAIL,
        TC.CUST_TYPE,
        TC.POST_ADDRESS,
        TC.CUST_SOURCE,
        TC.CUST_SOURCE_NAME,
        TC.RECOMMENDED,
        TC.SERVICE_MAN,
        TM.MANAGERNAME AS SERVICE_MAN_NAME,
        TC.STATUS,
        TC.STATUS_NAME ,
        TC.IMAGEIDENTIFICATION,
        TC.CONTACT_MAN,
        TC.LEGAL_MAN,
        TC.LEGAL_ADDRESS
    FROM
        EFCRM..TCUSTOMERS TC,
        CUST_TABLE CU,
        EFCRM..TCUSTMANAGERS TM,
        TDICTPARAM TD
    WHERE
        TC.SERVICE_MAN = TM.MANAGERID
        AND TD.TYPE_ID = 9997
        AND TD.TYPE_VALUE = TC.COUNTRY
        AND TC.CUST_ID = CU.CUST_ID) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 2 ORDER BY __row_number__

; uncategorized SQLException; SQL state [null]; error code [0]; sql injection violation, syntax error: syntax error, error in :'ABLE AS ( SELECT ', expect RPAREN, actual AS pos 128, line 1, column 126, token AS : WITH selectTemp AS (SELECT TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as row_number, WITH CUST_TABLE AS ( SELECT TC.CUST_ID FROM EFCRM..TCUSTOMERS TC, TBENIFITOR TB, TPRODUCT TP WHERE TP.PRODUCT_ID = TB.PRODUCT_ID

        AND TB.CUST_ID = TC.CUST_ID
    GROUP BY
        TC.CUST_ID
        ) SELECT TC.CUST_ID,
        TC.CUST_NO,
        TC.CUST_NAME,
        TC.BIRTHDAY,
        TC.CARD_TYPE,
        TC.CARD_TYPE_NAME,
        TC.CARD_ID,
        TC.CARD_VALID_DATE,
        TC.SEX,
        TC.COUNTRY,
        TD.TYPE_CONTENT AS COUNTRY_NAME,
        TC.VOC_TYPE_NAME,
        TC.MOBILE,
        TC.E_MAIL,
        TC.CUST_TYPE,
        TC.POST_ADDRESS,
        TC.CUST_SOURCE,
        TC.CUST_SOURCE_NAME,
        TC.RECOMMENDED,
        TC.SERVICE_MAN,
        TM.MANAGERNAME AS SERVICE_MAN_NAME,
        TC.STATUS,
        TC.STATUS_NAME ,
        TC.IMAGEIDENTIFICATION,
        TC.CONTACT_MAN,
        TC.LEGAL_MAN,
        TC.LEGAL_ADDRESS
    FROM
        EFCRM..TCUSTOMERS TC,
        CUST_TABLE CU,
        EFCRM..TCUSTMANAGERS TM,
        TDICTPARAM TD
    WHERE
        TC.SERVICE_MAN = TM.MANAGERID
        AND TD.TYPE_ID = 9997
        AND TD.TYPE_VALUE = TC.COUNTRY
        AND TC.CUST_ID = CU.CUST_ID) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 2 ORDER BY __row_number__; nested exception is java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'ABLE AS (
    SELECT
      ', expect RPAREN, actual AS pos 128, line 1, column 126, token AS : WITH selectTemp AS (SELECT TOP 100 PERCENT  ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__, WITH CUST_TABLE AS (
    SELECT
        TC.CUST_ID
    FROM
        EFCRM..TCUSTOMERS TC,
        TBENIFITOR TB,
        TPRODUCT TP
    WHERE
        TP.PRODUCT_ID = TB.PRODUCT_ID


        AND TB.CUST_ID = TC.CUST_ID
    GROUP BY
        TC.CUST_ID
        ) SELECT TC.CUST_ID,
        TC.CUST_NO,
        TC.CUST_NAME,
        TC.BIRTHDAY,
        TC.CARD_TYPE,
        TC.CARD_TYPE_NAME,
        TC.CARD_ID,
        TC.CARD_VALID_DATE,
        TC.SEX,
        TC.COUNTRY,
        TD.TYPE_CONTENT AS COUNTRY_NAME,
        TC.VOC_TYPE_NAME,
        TC.MOBILE,
        TC.E_MAIL,
        TC.CUST_TYPE,
        TC.POST_ADDRESS,
        TC.CUST_SOURCE,
        TC.CUST_SOURCE_NAME,
        TC.RECOMMENDED,
        TC.SERVICE_MAN,
        TM.MANAGERNAME AS SERVICE_MAN_NAME,
        TC.STATUS,
        TC.STATUS_NAME ,
        TC.IMAGEIDENTIFICATION,
        TC.CONTACT_MAN,
        TC.LEGAL_MAN,
        TC.LEGAL_ADDRESS
    FROM
        EFCRM..TCUSTOMERS TC,
        CUST_TABLE CU,
        EFCRM..TCUSTMANAGERS TM,
        TDICTPARAM TD
    WHERE
        TC.SERVICE_MAN = TM.MANAGERID
        AND TD.TYPE_ID = 9997
        AND TD.TYPE_VALUE = TC.COUNTRY
        AND TC.CUST_ID = CU.CUST_ID) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 2 ORDER BY __row_number__