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

   # 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
   #include <stdlib.h> 
   #include <stdio.h> 
   #include <sqlext.h>
   #ifdef WIN32
   #include <windows.h>
   #endif 
   SQLHENV       V_OD_Env;        // Handle ODBC environment
   SQLHDBC       V_OD_hdbc;       // Handle connection     
   SQLINTEGER    V_OD_erg;
   int main(int argc,char *argv[]) 
   {         
         // 1. 申请环境句柄       
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);   
  
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
      
         {           
              printf("Error AllocHandle\n");           
              exit(0);        
         } 
         // 2. 设置环境属性(版本信息)         
         SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 
0);      
         // 3. 申请连接句柄        
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);     
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {                     
              SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);          
              exit(0);       
         }
         // 4. 设置连接属性
         SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, 
0);          
         // 5. 连接数据源,这里的“userName”与“password”分别表示连接数据库的用户名和用户密码,请根据实际情况修改。
         // 
如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露。  
  
         V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,  
                              (SQLCHAR*) "userName", SQL_NTS,  (SQLCHAR*) 
"password", SQL_NTS);        
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {           
             printf("Error SQLConnect %d\n",V_OD_erg);            
             SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);       
             exit(0);        
         }     
         printf("Connected !\n");  
         // 6. 断开数据源连接并释放句柄资源   
         SQLDisconnect(V_OD_hdbc);         
         SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);       
         SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);  
         return(0);
   ```
   
   ```sql
   #include <stdlib.h> 
   #include <stdio.h> 
   #include <sqlext.h>
   #ifdef WIN32
   #include <windows.h>
   #endif 
   SQLHENV       V_OD_Env;        // Handle ODBC environment 
   SQLHSTMT      V_OD_hstmt;      // Handle statement 
   SQLHDBC       V_OD_hdbc;       // Handle connection     
   SQLINTEGER    V_OD_erg;
   int main(int argc,char *argv[]) 
   {              
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);   
  
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
      
         {           
              printf("Error AllocHandle\n");           
              exit(0);        
         } 
           
         SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 
0);      
           
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);     
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {                     
              SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);          
              exit(0);       
         }
    
         SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, 
0);          
       
         V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,  
                              (SQLCHAR*) "userName", SQL_NTS,  (SQLCHAR*) 
"password", SQL_NTS);        
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {           
             printf("Error SQLConnect %d\n",V_OD_erg);            
             SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);       
             exit(0);        
         }     
         printf("Connected !\n"); 
         // 1. 设置语句属性
         SQLSetStmtAttr(V_OD_hstmt,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER *)3,0);
         // 2. 申请语句句柄
         SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);       
         // 3. 创建表格。
         SQLExecDirect(V_OD_hstmt,"drop table IF EXISTS customer_t1",SQL_NTS);
         SQLExecDirect(V_OD_hstmt,"CREATE TABLE customer_t1(c_customer_sk 
INTEGER, c_customer_name VARCHAR(32));",SQL_NTS);
         printf("Done !\n");
         // 4. 断开数据源连接并释放句柄资源
         SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);    
         SQLDisconnect(V_OD_hdbc);         
         SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);       
         SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);  
         return(0);
   ```
   
   ```sql
   #include <stdlib.h> 
   #include <stdio.h> 
   #include <sqlext.h>
   #ifdef WIN32
   #include <windows.h>
   #endif 
   SQLHENV       V_OD_Env;        // Handle ODBC environment 
   SQLHSTMT      V_OD_hstmt;      // Handle statement 
   SQLHDBC       V_OD_hdbc;       // Handle connection     
   SQLINTEGER    value = 100;
   SQLINTEGER    V_OD_erg;
   int main(int argc,char *argv[]) 
   {             
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);   
  
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
      
         {           
              printf("Error AllocHandle\n");           
              exit(0);        
         } 
              
         SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 
0);      
             
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);     
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {                     
              SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);          
              exit(0);       
         }
       
         SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, 
0);          
     
         V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,  
                              (SQLCHAR*) "userName", SQL_NTS,  (SQLCHAR*) 
"password", SQL_NTS);        
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {           
             printf("Error SQLConnect %d\n",V_OD_erg);            
             SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);       
             exit(0);        
         }     
         printf("Connected !\n"); 
         
         SQLSetStmtAttr(V_OD_hstmt,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER *)3,0);
         
         SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);       
         
         // 1. 直接插入
         SQLExecDirect(V_OD_hstmt,"insert into customer_t1 
values(25,li)",SQL_NTS);
   
         // 2. pbe方法插入
         // 2.1 插入占位符
         SQLPrepare(V_OD_hstmt,"insert into customer_t1 values(?)",SQL_NTS); 
         // 2.2 绑定参数
         
SQLBindParameter(V_OD_hstmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,
                          &value,0,NULL);
         // 2.3 执行准备好的插入语句
         SQLExecute(V_OD_hstmt);
         
         // 3. 断开数据源连接并释放句柄资源
         SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);    
         SQLDisconnect(V_OD_hdbc);         
         SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);       
         SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);  
         return(0);
   ```
   
   ```sql
   #include <stdlib.h> 
   #include <stdio.h> 
   #include <sqlext.h>
   #ifdef WIN32
   #include <windows.h>
   #endif 
   SQLHENV       V_OD_Env;        // Handle ODBC environment 
   SQLHSTMT      V_OD_hstmt;      // Handle statement 
   SQLHDBC       V_OD_hdbc;       // Handle connection     
   char          typename[100];
   SQLINTEGER    V_OD_erg, V_OD_buffer, V_OD_err, V_OD_id;
   int main(int argc,char *argv[]) 
   {               
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);   
  
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
      
         {           
              printf("Error AllocHandle\n");           
              exit(0);        
         } 
                  
         SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 
0);      
                
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);     
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {                     
              SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);          
              exit(0);       
         }
             SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, 
SQL_AUTOCOMMIT_ON, 0);          
         
         V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,  
                              (SQLCHAR*) "userName", SQL_NTS,  (SQLCHAR*) 
"password", SQL_NTS);        
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {           
             printf("Error SQLConnect %d\n",V_OD_erg);            
             SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);       
             exit(0);        
         }     
         printf("Connected !\n"); 
      
         SQLSetStmtAttr(V_OD_hstmt,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER *)3,0);
        
         SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt); 
         
         // 1. 执行select语句
         SQLExecDirect(V_OD_hstmt,"select c_customer_sk from 
customer_t1",SQL_NTS);
         // 2. 获取结果集某一列的属性
         SQLColAttribute(V_OD_hstmt,1,SQL_DESC_TYPE,typename,100,NULL,NULL);    
             
         printf("SQLColAtrribute %s\n",typename);
         // 3. 绑定结果集
         SQLBindCol(V_OD_hstmt,1,SQL_C_SLONG, (SQLPOINTER)&V_OD_buffer,150,
                   (SQLLEN *)&V_OD_err);
         // 4. 通过SQLFetch取结果集中数据
         V_OD_erg=SQLFetch(V_OD_hstmt);
         // 5. 通过SQLGetData获取并返回数据。
         while(V_OD_erg != SQL_NO_DATA)
         {
             SQLGetData(V_OD_hstmt,1,SQL_C_SLONG,(SQLPOINTER)&V_OD_id,0,NULL);
             printf("SQLGetData ----ID = %d\n",V_OD_id);
             V_OD_erg=SQLFetch(V_OD_hstmt);
         };
         printf("Done !\n");
         // 6. 断开数据源连接并释放句柄资源
         SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);    
         SQLDisconnect(V_OD_hdbc);         
         SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);       
         SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);  
         return(0);
   ```
   
   ```sql
   #include <stdlib.h> 
   #include <stdio.h> 
   #include <sqlext.h>
   #ifdef WIN32
   #include <windows.h>
   #endif 
   SQLHENV       V_OD_Env;        // Handle ODBC environment 
   SQLHSTMT      V_OD_hstmt;      // Handle statement 
   SQLHDBC       V_OD_hdbc;       // Handle connection     
   SQLINTEGER    V_OD_erg;
   int main(int argc,char *argv[]) 
   {              
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);   
  
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
      
         {           
              printf("Error AllocHandle\n");           
              exit(0);        
         } 
                  
         SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 
0);      
                 
         V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);     
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {                     
              SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);          
              exit(0);       
         }
        
         SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, 
0);          
      
         V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,  
                              (SQLCHAR*) "userName", SQL_NTS,  (SQLCHAR*) 
"password", SQL_NTS);        
         if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))  
    
         {           
             printf("Error SQLConnect %d\n",V_OD_erg);            
             SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);       
             exit(0);        
         }     
         printf("Connected !\n"); 
         
         SQLSetStmtAttr(V_OD_hstmt,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER *)3,0);
         
         SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt); 
         
         // 1. 执行更新操作
         SQLExecDirect(V_OD_hstmt,"update customer_t1 set c_customer_sk = 1000 
where c_customer_name = 'li' ",SQL_NTS);
         // 16. 断开数据源连接并释放句柄资源
         SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);    
         SQLDisconnect(V_OD_hdbc);         
         SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);       
         SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);  
         return(0);
   ```
   
   # 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