blob: 09394ab05f674b9f67046a55657fbb527feccd30 [file] [log] [blame]
<!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>
<li class=""><a href="/avatica/docs/testapi/">Test 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 &copy;&nbsp;2019
<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&nbsp;License&nbsp;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>