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

   # 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
   --启用SQL引擎Beta特性feature1。
   set sql_beta_feature=feature1;
   --启用SQL引擎Beta特性feature2和feature3。
   set sql_beta_feature=feature2,feature3;
   --关闭所有可选SQL引擎Beta特性。
   set sql_beta_feature=none;
   ```
   
   ```sql
   SQLRETURN  SQLGetDiagRec(SQLSMALLINT    HandleType
                            SQLHANDLE      Handle,
                            SQLSMALLINT    RecNumber,
                            SQLCHAR        *SQLState,
                            SQLINTEGER     *NativeErrorPtr,
                            SQLCHAR        *MessageText,
                            SQLSMALLINT    BufferLength
                            SQLSMALLINT    *TextLengthPtr);
   ```
   
   ```sql
   #include <stdio.h>
   #include <stdlib.h>
   #include <libpq-fe.h>
   
   static void
   exit_nicely(PGconn *conn)
   {
       PQfinish(conn);
       exit(1);
   }
   
   int
   main(int argc, char **argv)
   {
       const char *conninfo;
       PGconn     *conn;
   
       /*
        * 用户在命令行上提供了conninfo字符串的值时使用该值
        * 否则环境变量或者所有其它连接参数
        * 都使用缺省值。
        */
       if (argc > 1)
           conninfo = argv[1];
       else
           conninfo = "dbname=postgres port=42121 host='10.44.133.171' 
application_name=test connect_timeout=5 sslmode=allow user='test' 
password='test_1234'";
   
       /* 连接数据库 */
       conn = PQconnectdb(conninfo);
   
       /* 检查后端连接成功建立 */
       if (PQstatus(conn) != CONNECTION_OK)
       {
           fprintf(stderr, "Connection to database failed: %s",
                   PQerrorMessage(conn));
           exit_nicely(conn);
       }
   
       /* 关闭数据库连接并清理 */
       PQfinish(conn);
   
       return 0;
   ```
   
   ```sql
   #include <stdio.h>
   #include <stdlib.h>
   #include <libpq-fe.h>
   
   static void
   exit_nicely(PGconn *conn)
   {
       PQfinish(conn);
       exit(1);
   }
   
   int
   main(int argc, char **argv)
   {
       const char *conninfo;
       PGconn     *conn;
       PGresult   *res;
       int         nFields;
       int         i,j;
   
       if (argc > 1)
           conninfo = argv[1];
       else
           conninfo = "dbname=postgres port=42121 host='10.44.133.171' 
application_name=test connect_timeout=5 sslmode=allow user='test' 
password='test_1234'";
   
       conn = PQconnectdb(conninfo);
   
       if (PQstatus(conn) != CONNECTION_OK)
       {
           fprintf(stderr, "Connection to database failed: %s",
                   PQerrorMessage(conn));
           exit_nicely(conn);
       }
   
       res = PQexec(conn, "CREATE TABLE customer_t1(c_customer_sk INTEGER, 
c_customer_name VARCHAR(32))");
       if (PQresultStatus(res) != PGRES_COMMAND_OK)
       {
           fprintf(stderr, "CREATE command failed: %s", PQerrorMessage(conn));
           PQclear(res);
           exit_nicely(conn);
       }
   
       /* 关闭数据库连接并清理 */
       PQfinish(conn);
   
       return 0;
   ```
   
   ```sql
   #include <stdio.h>
   #include <stdlib.h>
   #include <libpq-fe.h>
   
   static void
   exit_nicely(PGconn *conn)
   {
       PQfinish(conn);
       exit(1);
   }
   
   int
   main(int argc, char **argv)
   {
       const char *conninfo;
       PGconn     *conn;
       PGresult   *res;
   
       if (argc > 1)
           conninfo = argv[1];
       else
           conninfo = "dbname=postgres port=42121 host='10.44.133.171' 
application_name=test connect_timeout=5 sslmode=allow user='test' 
password='test_1234'";
   
       conn = PQconnectdb(conninfo);
   
       if (PQstatus(conn) != CONNECTION_OK)
       {
           fprintf(stderr, "Connection to database failed: %s",
                   PQerrorMessage(conn));
           exit_nicely(conn);
       }
   
       res = PQexec(conn, "insert into customer_t1 values(25,'li')");
       if (PQresultStatus(res) != PGRES_COMMAND_OK)
       {
           fprintf(stderr, "INSERT command failed: %s", PQerrorMessage(conn));
           PQclear(res);
           exit_nicely(conn);
       }
   
       /* 关闭数据库连接并清理 */
       PQfinish(conn);
   
       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