Francis Chuang created CALCITE-1196:
---------------------------------------

             Summary: Cache statement handle signatures for prepared statements 
so that the client won't have to send them during execution
                 Key: CALCITE-1196
                 URL: https://issues.apache.org/jira/browse/CALCITE-1196
             Project: Calcite
          Issue Type: Improvement
          Components: avatica
    Affects Versions: avatica-1.7.1
            Reporter: Francis Chuang
            Priority: Minor


With avatica 1.7.1, to prepare and execute a statement, we need to do the 
following (shown using curl):

{code}
C:\Users\user
λ curl localhost:8765 -XPOST --data '{"request": "prepare","connectionId": 
"my-conn","sql": "SELECT * FROM my_table","maxRowCount": 1}'

{
   "response": "prepare",
   "statement": {
      "connectionId": "my-conn",
      "id": 25,
      "signature": {
         "columns": [
            {
               "ordinal": 0,
               "autoIncrement": false,
               "caseSensitive": false,
               "searchable": true,
               "currency": false,
               "nullable": 0,
               "signed": true,
               "displaySize": 40,
               "label": "K",
               "columnName": "K",
               "schemaName": "",
               "precision": 0,
               "scale": 0,
               "tableName": "MY_TABLE",
               "catalogName": "",
               "type": {
                  "type": "scalar",
                  "id": -5,
                  "name": "BIGINT",
                  "rep": "PRIMITIVE_LONG"
               },
               "readOnly": true,
               "writable": false,
               "definitelyWritable": false,
               "columnClassName": "java.lang.Long"
            },
            {
               "ordinal": 1,
               "autoIncrement": false,
               "caseSensitive": false,
               "searchable": true,
               "currency": false,
               "nullable": 1,
               "signed": false,
               "displaySize": 40,
               "label": "V",
               "columnName": "V",
               "schemaName": "",
               "precision": 0,
               "scale": 0,
               "tableName": "MY_TABLE",
               "catalogName": "",
               "type": {
                  "type": "scalar",
                  "id": 12,
                  "name": "VARCHAR",
                  "rep": "STRING"
               },
               "readOnly": true,
               "writable": false,
               "definitelyWritable": false,
               "columnClassName": "java.lang.String"
            }
         ],
         "sql": "SELECT * FROM my_table",
         "parameters": [],
         "cursorFactory": {
            "style": "LIST",
            "clazz": null,
            "fieldNames": null
         },
         "statementType": null
      }
   },
   "rpcMetadata": {
      "response": "rpcMetadata",
      "serverAddress": "f826338-phoenix-server.f826338:8765"
   }
}

C:\Users\user
λ curl localhost:8765 -XPOST --data '{
   "request": "execute",
   "statementHandle": {
      "connectionId": "my-conn",
      "id": 25,
      "signature": {
         "columns": [
            {
               "ordinal": 0,
               "autoIncrement": false,
               "caseSensitive": false,
               "searchable": true,
               "currency": false,
               "nullable": 0,
               "signed": true,
               "displaySize": 40,
               "label": "K",
               "columnName": "K",
               "schemaName": "",
               "precision": 0,
               "scale": 0,
               "tableName": "MY_TABLE",
               "catalogName": "",
               "type": {
                  "type": "scalar",
                  "id": -5,
                  "name": "BIGINT",
                  "rep": "PRIMITIVE_LONG"
               },
               "readOnly": true,
               "writable": false,
               "definitelyWritable": false,
               "columnClassName": "java.lang.Long"
            },
            {
               "ordinal": 1,
               "autoIncrement": false,
               "caseSensitive": false,
               "searchable": true,
               "currency": false,
               "nullable": 1,
               "signed": false,
               "displaySize": 40,
               "label": "V",
               "columnName": "V",
               "schemaName": "",
               "precision": 0,
               "scale": 0,
               "tableName": "MY_TABLE",
               "catalogName": "",
               "type": {
                  "type": "scalar",
                  "id": 12,
                  "name": "VARCHAR",
                  "rep": "STRING"
               },
               "readOnly": true,
               "writable": false,
               "definitelyWritable": false,
               "columnClassName": "java.lang.String"
            }
         ],
         "sql": "SELECT * FROM my_table",
         "parameters": [],
         "cursorFactory": {
            "style": "LIST",
            "clazz": null,
            "fieldNames": null
         },
         "statementType": null
      }
   },
   "parameterValues": [],
   "maxRowCount": 1
}'
{code}

Notice that we receive the signature in the {{statementHandle}} when running a 
prepare request. We then attach this so the execute request to execute the 
statement.

The UX can be improved by caching that signature on the server along with the 
prepared statement to avoid having to ask the client to send it with the 
execution request.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to