FlyingZC opened a new issue, #27676:
URL: https://github.com/apache/shardingsphere/issues/27676

   # Background
   Hi community,
   
   ShardingSphere parser engine helps users parse a SQL to get the AST 
(Abstract Syntax Tree) and visit this tree to get SQLStatement (Java Object). 
Currently, we are planning to enhance the support for openGauss SQL parsing in 
ShardingSphere.
   
   More details:
   
https://shardingsphere.apache.org/document/current/en/reference/sharding/parse/
   
   # Task
   This issue is to support more openGauss sql parse, as follows:
   ```sql
   SQLRETURN SQLBindCol(SQLHSTMT       StatementHandle,    
                        SQLUSMALLINT   ColumnNumber,     
                        SQLSMALLINT    TargetType,
                        SQLPOINTER     TargetValuePtr,
                        SQLLEN     BufferLength,
                        SQLLEN     *StrLen_or_IndPtr);
   ```
   
   ```sql
   import java.sql.Connection; 
   import java.sql.DriverManager; 
   import java.io.IOException;
   import java.io.FileInputStream;
   import java.io.FileOutputStream;
   import java.sql.SQLException; 
   import org.opengauss.copy.CopyManager; 
   import org.opengauss.core.BaseConnection;
    
   public class Copy{ 
   
        public static void main(String[] args) 
        { 
         String urls = new 
String("jdbc:opengauss://10.180.155.74:8000/postgres"); //数据库URL 
         String username = new String("jack");            //用户名 
         String password = new String("Gauss@123");             //密码 
         String tablename = new String("migration_table"); //定义表信息 
         String tablename1 = new String("migration_table_1"); //定义表信息 
         String driver = "org.opengauss.Driver"; 
         Connection conn = null; 
         
         try { 
               Class.forName(driver); 
               conn = DriverManager.getConnection(urls, username, password);    
     
             } catch (ClassNotFoundException e) { 
                  e.printStackTrace(System.out); 
             } catch (SQLException e) { 
                  e.printStackTrace(System.out); 
             } 
         
         // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt  
         try {
        copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)");
      } catch (SQLException e) {
       
     e.printStackTrace();
      } catch (IOException e) {
    
     e.printStackTrace();
      }    
         //将d:/data.txt中的数据导入到migration_table_1中。
         try {
         copyFromFile(conn, "d:/data.txt", tablename1);
      } catch (SQLException e) {
            e.printStackTrace();
    } catch (IOException e) {
     
     e.printStackTrace();
    }  
   
         // 将migration_table_1中的数据导出到本地文件d:/data1.txt  
         try {
         copyToFile(conn, "d:/data1.txt", tablename1);
      } catch (SQLException e) {
     
     e.printStackTrace();
      } catch (IOException e) {
     
   
     e.printStackTrace();
    }        
        } 
     // 使用copyIn把数据从文件中导入数据库,
     public static void copyFromFile(Connection connection, String filePath, 
String tableName)   
            throws SQLException, IOException {  
          
        FileInputStream fileInputStream = null;  
      
        try {  
            CopyManager copyManager = new 
CopyManager((BaseConnection)connection);  
            fileInputStream = new FileInputStream(filePath);  
            copyManager.copyIn("COPY " + tableName + " FROM STDIN", 
fileInputStream);  
        } finally {  
            if (fileInputStream != null) {  
                try {  
                    fileInputStream.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
     
     // 使用copyOut把数据从数据库中导出到文件中
     public static void copyToFile(Connection connection, String filePath, 
String tableOrQuery)   
             throws SQLException, IOException {  
           
         FileOutputStream fileOutputStream = null;  
      
         try {  
             CopyManager copyManager = new 
CopyManager((BaseConnection)connection);  
             fileOutputStream = new FileOutputStream(filePath);  
             copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", 
fileOutputStream);  
         } finally {  
             if (fileOutputStream != null) {  
                 try {  
                     fileOutputStream.close();  
                 } catch (IOException e) {  
                     e.printStackTrace();
   ```
   
   ```sql
   DBE_PLDEBUGGER.turn_off(Oid)
   RETURN boolean;
   ```
   
   ```sql
   CREATE [ OR REPLACE ] SYNONYM synonym_name 
       FOR object_name;
   ```
   
   ```sql
    CREATE OR REPLACE FUNCTION ot.add(a integer, b integer) RETURNS integer AS
   $$
   SELECT $1 + $2
   $$
   LANGUAGE sql;
   
   
   ```
   
   # Process
   1. First confirm that this is a correct openGauss sql syntax, if not please 
leave a message under the issue and ignore it;
   2. Compare SQL definitions in Official SQL Doc and ShardingSphere SQL Doc;
   3. If there is any difference in ShardingSphere SQL Doc, please correct them 
by referring to the Official SQL Doc;
   4. Run mvn install the current_file_module;
   5. Check whether there are any exceptions. If indeed, please fix them. 
(Especially xxxVisitor.class);
   6. Add new corresponding SQL case in SQL Cases and expected parsed result in 
Expected Statement XML;
   7. Run SQLParserParameterizedTest to make sure no exceptions.
   
   # Relevant Skills
   1. Master JAVA language
   2. Have a basic understanding of Antlr `g4` file
   3. Be familiar with openGauss SQLs


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: 
[email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to