| <!DOCTYPE HTML> |
| <html lang="en-US"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Protocol Testing</title> |
| <meta name="viewport" content="width=device-width,initial-scale=1"> |
| <meta name="generator" content="Jekyll v3.7.3"> |
| <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900"> |
| <link rel="stylesheet" href="/avatica/css/screen.css"> |
| <link rel="icon" type="image/x-icon" href="/avatica/favicon.ico"> |
| <!--[if lt IE 9]> |
| <script src="/js/html5shiv.min.js"></script> |
| <script src="/js/respond.min.js"></script> |
| <![endif]--> |
| </head> |
| |
| |
| <body class="wrap"> |
| <header role="banner"> |
| <nav class="mobile-nav show-on-mobiles"> |
| <ul> |
| <li class=""> |
| <a href="/avatica/">Home</a> |
| </li> |
| <li class=""> |
| <a href="/avatica/downloads/">Download</a> |
| </li> |
| <li class=""> |
| <a href="/avatica/community/">Community</a> |
| </li> |
| <li class=""> |
| <a href="/avatica/develop/">Develop</a> |
| </li> |
| <li class=""> |
| <a href="/avatica/news/">News</a> |
| </li> |
| <li class="current"> |
| <a href="/avatica/docs/">Docs</a> |
| </li> |
| </ul> |
| |
| </nav> |
| <div class="grid"> |
| <div class="unit one-third center-on-mobiles"> |
| <h1> |
| <a href="/avatica/"> |
| <span class="sr-only">Apache Calcite Avatica</span> |
| <img src="/avatica/img/logo.png" width="226" height="140" alt="Calcite Logo"> |
| </a> |
| </h1> |
| </div> |
| <nav class="main-nav unit two-thirds hide-on-mobiles"> |
| <ul> |
| <li class=""> |
| <a href="/avatica/">Home</a> |
| </li> |
| <li class=""> |
| <a href="/avatica/downloads/">Download</a> |
| </li> |
| <li class=""> |
| <a href="/avatica/community/">Community</a> |
| </li> |
| <li class=""> |
| <a href="/avatica/develop/">Develop</a> |
| </li> |
| <li class=""> |
| <a href="/avatica/news/">News</a> |
| </li> |
| <li class="current"> |
| <a href="/avatica/docs/">Docs</a> |
| </li> |
| </ul> |
| |
| </nav> |
| </div> |
| </header> |
| |
| |
| <section class="docs"> |
| <div class="grid"> |
| |
| <div class="docs-nav-mobile unit whole show-on-mobiles"> |
| <select onchange="if (this.value) window.location.href=this.value"> |
| <option value="">Navigate the docs…</option> |
| |
| <optgroup label="Overview"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </optgroup> |
| |
| <optgroup label="Avatica Reference"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </optgroup> |
| |
| <optgroup label="Avatica Go Client Reference"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </optgroup> |
| |
| <optgroup label="Avatica Meta"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </optgroup> |
| |
| <optgroup label="Avatica Go Client Meta"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </optgroup> |
| |
| </select> |
| </div> |
| |
| |
| <div class="unit four-fifths"> |
| <article> |
| <h1>Protocol Testing</h1> |
| <!-- |
| |
| --> |
| |
| <p>Building Avatica clients in a variety of languages is one of the primary |
| goals of Avatica. There are various tools which can help in this process, |
| but one of the most useful is a reference for how clients interact with |
| the Avatica server.</p> |
| |
| <h2 id="testing-with-curl">Testing with cURL</h2> |
| |
| <p>A trivial way to interact with an Avatica server is using cURL and the JSON |
| serialization. The below was tested to work with Avatica 1.10.0:</p> |
| |
| <figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#!/usr/bin/env bash</span> |
| |
| <span class="nb">set</span> <span class="nt">-u</span> |
| |
| <span class="nv">AVATICA</span><span class="o">=</span><span class="nv">$1</span> |
| <span class="nv">SQL</span><span class="o">=</span><span class="nv">$2</span> |
| |
| <span class="nv">CONNECTION_ID</span><span class="o">=</span><span class="s2">"conn-</span><span class="k">$(</span>whoami<span class="k">)</span><span class="s2">-</span><span class="k">$(</span>date +%s<span class="k">)</span><span class="s2">"</span> |
| <span class="nv">MAX_ROW_COUNT</span><span class="o">=</span>100 |
| <span class="nv">NUM_ROWS</span><span class="o">=</span>2 |
| <span class="nv">OFFSET</span><span class="o">=</span>0 |
| |
| <span class="nb">echo</span> <span class="s2">"Open connection"</span> |
| <span class="nv">openConnectionReq</span><span class="o">=</span><span class="s2">"{</span><span class="se">\"</span><span class="s2">request</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">openConnection</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">connectionId</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="k">${</span><span class="nv">CONNECTION_ID</span><span class="k">}</span><span class="se">\"</span><span class="s2">}"</span> |
| <span class="c"># Example of how to set connection properties with info key</span> |
| <span class="c"># openConnectionReqWithProperties="{\"request\": \"openConnection\",\"connectionId\": \"${CONNECTION_ID}\",\"info\": {\"user\": \"SCOTT\",\"password\": \"TIGER\"}}"</span> |
| curl <span class="nt">-i</span> <span class="nt">-w</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$AVATICA</span><span class="s2">"</span> <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">--data</span> <span class="s2">"</span><span class="nv">$openConnectionReq</span><span class="s2">"</span> |
| <span class="nb">echo |
| |
| echo</span> <span class="s2">"Create statement"</span> |
| <span class="nv">STATEMENTRSP</span><span class="o">=</span><span class="k">$(</span>curl <span class="nt">-s</span> <span class="s2">"</span><span class="nv">$AVATICA</span><span class="s2">"</span> <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">--data</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">request</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">createStatement</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">connectionId</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="k">${</span><span class="nv">CONNECTION_ID</span><span class="k">}</span><span class="se">\"</span><span class="s2">}"</span><span class="k">)</span> |
| <span class="nv">STATEMENTID</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$STATEMENTRSP</span><span class="s2">"</span> | jq .statementId<span class="k">)</span> |
| <span class="nb">echo |
| |
| echo</span> <span class="s2">"PrepareAndExecuteRequest"</span> |
| curl <span class="nt">-i</span> <span class="nt">-w</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$AVATICA</span><span class="s2">"</span> <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">--data</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">request</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">prepareAndExecute</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">connectionId</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="k">${</span><span class="nv">CONNECTION_ID</span><span class="k">}</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">statementId</span><span class="se">\"</span><span class="s2">: </span><span class="nv">$STATEMENTID</span><span class="s2">,</span><span class="se">\"</span><span class="s2">sql</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="nv">$SQL</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">maxRowCount</span><span class="se">\"</span><span class="s2">: </span><span class="k">${</span><span class="nv">MAX_ROW_COUNT</span><span class="k">}</span><span class="s2">, </span><span class="se">\"</span><span class="s2">maxRowsInFirstFrame</span><span class="se">\"</span><span class="s2">: </span><span class="k">${</span><span class="nv">NUM_ROWS</span><span class="k">}</span><span class="s2">}"</span> |
| <span class="nb">echo</span> |
| |
| <span class="c"># Loop through all the results</span> |
| <span class="nv">ISDONE</span><span class="o">=</span><span class="nb">false |
| </span><span class="k">while</span> <span class="o">!</span> <span class="nv">$ISDONE</span><span class="p">;</span> <span class="k">do |
| </span><span class="nv">OFFSET</span><span class="o">=</span><span class="k">$((</span>OFFSET <span class="o">+</span> NUM_ROWS<span class="k">))</span> |
| <span class="nb">echo</span> <span class="s2">"FetchRequest - Offset=</span><span class="nv">$OFFSET</span><span class="s2">"</span> |
| <span class="nv">FETCHRSP</span><span class="o">=</span><span class="k">$(</span>curl <span class="nt">-s</span> <span class="s2">"</span><span class="nv">$AVATICA</span><span class="s2">"</span> <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">--data</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">request</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">fetch</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">connectionId</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="k">${</span><span class="nv">CONNECTION_ID</span><span class="k">}</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">statementId</span><span class="se">\"</span><span class="s2">: </span><span class="nv">$STATEMENTID</span><span class="s2">,</span><span class="se">\"</span><span class="s2">offset</span><span class="se">\"</span><span class="s2">: </span><span class="k">${</span><span class="nv">OFFSET</span><span class="k">}</span><span class="s2">,</span><span class="se">\"</span><span class="s2">fetchMaxRowCount</span><span class="se">\"</span><span class="s2">: </span><span class="k">${</span><span class="nv">NUM_ROWS</span><span class="k">}</span><span class="s2">}"</span><span class="k">)</span> |
| <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$FETCHRSP</span><span class="s2">"</span> |
| <span class="nv">ISDONE</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$FETCHRSP</span><span class="s2">"</span> | jq .frame.done<span class="k">)</span> |
| <span class="nb">echo |
| </span><span class="k">done |
| |
| </span><span class="nb">echo</span> <span class="s2">"Close statement"</span> |
| curl <span class="nt">-i</span> <span class="nt">-w</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$AVATICA</span><span class="s2">"</span> <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">--data</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">request</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">closeStatement</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">connectionId</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="k">${</span><span class="nv">CONNECTION_ID</span><span class="k">}</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">statementId</span><span class="se">\"</span><span class="s2">: </span><span class="nv">$STATEMENTID</span><span class="s2">}"</span> |
| <span class="nb">echo |
| |
| echo</span> <span class="s2">"Close connection"</span> |
| curl <span class="nt">-i</span> <span class="nt">-w</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$AVATICA</span><span class="s2">"</span> <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">--data</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">request</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">closeConnection</span><span class="se">\"</span><span class="s2">,</span><span class="se">\"</span><span class="s2">connectionId</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="k">${</span><span class="nv">CONNECTION_ID</span><span class="k">}</span><span class="se">\"</span><span class="s2">}"</span> |
| <span class="nb">echo</span></code></pre></figure> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <div class="section-nav"> |
| <div class="left align-right"> |
| |
| |
| |
| <a href="/avatica/docs/docker.html" class="prev">Previous</a> |
| |
| </div> |
| <div class="right align-left"> |
| |
| |
| |
| |
| |
| <a href="/avatica/docs/go_client_reference.html" class="next">Next</a> |
| |
| </div> |
| </div> |
| <div class="clear"></div> |
| |
| |
| </article> |
| </div> |
| |
| <div class="unit one-fifth hide-on-mobiles"> |
| <aside> |
| |
| <h4>Overview</h4> |
| |
| |
| <ul> |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/index.html">Background</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/roadmap.html">Roadmap</a></li> |
| |
| |
| </ul> |
| |
| |
| <h4>Avatica Reference</h4> |
| |
| |
| <ul> |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/client_reference.html">Client Reference</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/json_reference.html">JSON Reference</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/protobuf_reference.html">Protobuf Reference</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/howto.html">HOWTO</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/security.html">Security</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/compatibility.html">Compatibility</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/custom_client_artifacts.html">Custom Client Artifacts</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/docker.html">Docker Images</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class="current"><a href="/avatica/docs/protocol_testing.html">Protocol Testing</a></li> |
| |
| |
| </ul> |
| |
| |
| <h4>Avatica Go Client Reference</h4> |
| |
| |
| <ul> |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/go_client_reference.html">Go Client Reference</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/go_howto.html">HOWTO</a></li> |
| |
| |
| </ul> |
| |
| |
| <h4>Avatica Meta</h4> |
| |
| |
| <ul> |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/history.html">History</a></li> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/api/">API</a></li> |
| |
| |
| </ul> |
| |
| |
| <h4>Avatica Go Client Meta</h4> |
| |
| |
| <ul> |
| |
| |
| |
| |
| |
| |
| |
| |
| <li class=""><a href="/avatica/docs/go_history.html">Go Client History</a></li> |
| |
| |
| </ul> |
| |
| |
| </aside> |
| </div> |
| |
| |
| <div class="clear"></div> |
| |
| </div> |
| </section> |
| |
| |
| <footer role="contentinfo"> |
| <div id="poweredby"> |
| <a href="http://www.apache.org/"> |
| <span class="sr-only">Apache</span> |
| <img src="/avatica/img/feather.png" width="190" height="77" alt="Apache Logo"></a> |
| </div> |
| <div id="copyright"> |
| <p>The contents of this website are © 2020 |
| <a href="https://www.apache.org/">Apache Software Foundation</a> |
| under the terms of |
| the <a href="https://www.apache.org/licenses/LICENSE-2.0.html"> |
| Apache License v2</a>. Apache Calcite and its logo are |
| trademarks of the Apache Software Foundation.</p> |
| </div> |
| </footer> |
| |
| <script> |
| var anchorForId = function (id) { |
| var anchor = document.createElement("a"); |
| anchor.className = "header-link"; |
| anchor.href = "#" + id; |
| anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>"; |
| anchor.title = "Permalink"; |
| return anchor; |
| }; |
| |
| var linkifyAnchors = function (level, containingElement) { |
| var headers = containingElement.getElementsByTagName("h" + level); |
| for (var h = 0; h < headers.length; h++) { |
| var header = headers[h]; |
| |
| if (typeof header.id !== "undefined" && header.id !== "") { |
| header.appendChild(anchorForId(header.id)); |
| } |
| } |
| }; |
| |
| document.onreadystatechange = function () { |
| if (this.readyState === "complete") { |
| var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0]; |
| if (!contentBlock) { |
| return; |
| } |
| for (var level = 1; level <= 6; level++) { |
| linkifyAnchors(level, contentBlock); |
| } |
| } |
| }; |
| </script> |
| |
| |
| </body> |
| </html> |