Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

using database encryption and decryption to fill in Oracle pagination SQL fields resulted in invalid 'ROWNUM' identifier #32800

Open
aillamsun opened this issue Sep 5, 2024 · 5 comments

Comments

@aillamsun
Copy link

aillamsun commented Sep 5, 2024

use version

<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>shardingsphere-jdbc-core</artifactId>
  <version>5.2.1</version>
</dependency>

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <version>12.2.0.1</version>
</dependency>

configuration

TB_VEHICLE_AUTH_REQUEST_LOGS: 
  columns:
    VIN:
      plainColumn: VIN
      cipherColumn: VIN_CIPHER
      assistedQueryColumn: VIN_QUERY_CIPHER 
      assistedQueryEncryptorName: assisted_query_encryptor 
      encryptorName: kms_encryptor
    PHONE: 
      plainColumn: PHONE
      cipherColumn: PHONE_CIPHER
      assistedQueryColumn: PHONE_QUERY_CIPHER 
      assistedQueryEncryptorName: assisted_query_encryptor 
      encryptorName: kms_encryptor
    VEHICLE_PLATE_NO: 
      plainColumn: VEHICLE_PLATE_NO
      cipherColumn: VEHICLE_PLATE_NO_CIPHER
      assistedQueryColumn: VEHICLE_PLATE_NO_QUERY_CIPHER 
      assistedQueryEncryptorName: assisted_query_encryptor 
      encryptorName: kms_encryptor

Problem occurred

1.Logic SQL

image
SELECT *
FROM 
    (
    SELECT TMP.*,
         ROWNUM ROW_ID
    FROM 
        (SELECT ID,
        TYPE,
        USER_ID,
        PHONE,
        VEHICLE_PLATE_NO,
        VIN,
        CHANGE_LOG,
        CREATE_TIME
        FROM TB_VEHICLE_AUTH_REQUEST_LOGS
        ORDER BY  CREATE_TIME DESC ) TMP
        WHERE ROWNUM <=?)
    WHERE ROW_ID > ?

2.Actual SQL

image
SELECT "ID",
         "TYPE",
         "USER_ID",
         "PHONE_CIPHER" AS "PHONE",
         "VEHICLE_PLATE_NO_CIPHER" AS "VEHICLE_PLATE_NO",
         "VIN_CIPHER" AS "VIN",
         "CHANGE_LOG",
         "CREATE_TIME",
         "ROWNUM" AS "ROW_ID"
FROM 
    (SELECT "ID",
         "TYPE",
         "USER_ID",
         "PHONE_CIPHER",
         "PHONE_QUERY_CIPHER",
         "PHONE",
         "VEHICLE_PLATE_NO_CIPHER",
         "VEHICLE_PLATE_NO_QUERY_CIPHER",
         "VEHICLE_PLATE_NO",
         "VIN_CIPHER",
         "VIN_QUERY_CIPHER",
         "VIN",
         "CHANGE_LOG",
         "CREATE_TIME",
         ROWNUM ROW_ID
    FROM 
        (SELECT ID,
        TYPE,
        USER_ID,
        PHONE_CIPHER,
         PHONE_QUERY_CIPHER,
         PHONE,
        VEHICLE_PLATE_NO_CIPHER,
         VEHICLE_PLATE_NO_QUERY_CIPHER,
         VEHICLE_PLATE_NO,
        VIN_CIPHER,
         VIN_QUERY_CIPHER,
         VIN,
        CHANGE_LOG,
        CREATE_TIME
        FROM TB_VEHICLE_AUTH_REQUEST_LOGS
        ORDER BY  CREATE_TIME DESC ) TMP
        WHERE ROWNUM <=?)
    WHERE ROW_ID > ?

result

image

as the boss encountered this problem?

@terrymanu
Copy link
Member

Can you try to the lasted version?

@comecny
Copy link
Contributor

comecny commented Sep 7, 2024

It seems that the Oracle 5.21 version does not support ROWNUM parsing, but the latest version does

@aillamsun
Copy link
Author

aillamsun commented Sep 9, 2024

Can you try to the lasted version?

use 5.4.1 or 5.5.0 error occurred

columns:
  VIN: 
    cipher:
      name: VIN_CIPHER
      encryptorName: kms_encryptor
    assistedQuery:
      name: VIN_QUERY_CIPHER
      encryptorName: assisted_query_encryptor
  PHONE:
    cipher:
      name: PHONE_CIPHER
      encryptorName: kms_encryptor
    assistedQuery:
      name: PHONE_QUERY_CIPHER
      encryptorName: assisted_query_encryptor
  VEHICLE_PLATE_NO: 
    cipher:
      name: VEHICLE_PLATE_NO_CIPHER
      encryptorName: kms_encryptor
    assistedQuery:
      name: VEHICLE_PLATE_NO_QUERY_CIPHER
      encryptorName: assisted_query_encryptor
SELECT
  *
FROM
  (
    SELECT
      TMP.*,
      ROWNUM ROW_ID
    FROM
      (
        SELECT
          ID,
          TYPE,
          USER_ID,
          PHONE,
          VEHICLE_PLATE_NO,
          VIN,
          CHANGE_LOG,
          CREATE_TIME
        FROM
          TB_VEHICLE_AUTH_REQUEST_LOGS
        ORDER BY
          CREATE_TIME DESC
      ) TMP
    WHERE
      ROWNUM <= ?
  )
WHERE
  ROW_ID > ?

error msg

Cause: java.sql.SQLException: Unsupported SQL operation: Can not support encrypt shorthand expand with subquery statement.

@aillamsun
Copy link
Author

It seems that the Oracle 5.21 version does not support ROWNUM parsing, but the latest version does

I use 5.4.1 can't do it.

@aillamsun
Copy link
Author

5.4.1 does it not support storing plaintext fields ? I need a data transition phase for my transformation.

5.2.1 support plaintext

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants