blob: e87c3bb14e8832d270cb9d573c2e3c72c3e19129 [file] [log] [blame]
<!doctype html>
<html class="no-js" lang="en" data-content_root="./">
<head><meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<meta name="color-scheme" content="light dark"><meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="index" title="Index" href="genindex.html" /><link rel="search" title="Search" href="search.html" /><link rel="next" title="Java Reference (javadoc)" href="reference/index.html" /><link rel="prev" title="C Data Interface" href="cdata.html" />
<!-- Generated with Sphinx 8.1.3 and Furo 2024.08.06 -->
<title>Arrow JDBC Adapter - arrow-java 18.1.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=8f2a1f02" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=354aac6f" />
<link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=302659d7" />
<style>
body {
--color-code-background: #f8f8f8;
--color-code-foreground: black;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc">
<label class="overlay sidebar-overlay" for="__navigation">
<div class="visually-hidden">Hide navigation sidebar</div>
</label>
<label class="overlay toc-overlay" for="__toc">
<div class="visually-hidden">Hide table of contents sidebar</div>
</label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<div class="visually-hidden">Toggle site navigation sidebar</div>
<i class="icon"><svg><use href="#svg-menu"></use></svg></i>
</label>
</div>
<div class="header-center">
<a href="index.html"><div class="brand">arrow-java 18.1.0 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="index.html">
<span class="sidebar-brand-text">arrow-java 18.1.0 documentation</span>
</a><form class="sidebar-search-container" method="get" action="search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="quickstartguide.html">Quick Start Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="overview.html">High-Level Overview</a></li>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installing Java Modules</a></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="developers/index.html">Java Development</a><input class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Java Development</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul>
<li class="toctree-l2"><a class="reference internal" href="developers/building.html">Building Arrow Java</a></li>
<li class="toctree-l2"><a class="reference internal" href="developers/development.html">Development Guidelines</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="memory.html">Memory Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="vector.html">ValueVector</a></li>
<li class="toctree-l1"><a class="reference internal" href="vector_schema_root.html">Tabular Data</a></li>
<li class="toctree-l1"><a class="reference internal" href="table.html">Table</a></li>
<li class="toctree-l1"><a class="reference internal" href="ipc.html">Reading/Writing IPC formats</a></li>
<li class="toctree-l1"><a class="reference internal" href="algorithm.html">Java Algorithms</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight.html">Arrow Flight RPC</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight_sql.html">Arrow Flight SQL</a></li>
<li class="toctree-l1"><a class="reference internal" href="flight_sql_jdbc_driver.html">Arrow Flight SQL JDBC Driver</a></li>
<li class="toctree-l1"><a class="reference internal" href="dataset.html">Dataset</a></li>
<li class="toctree-l1"><a class="reference internal" href="substrait.html">Substrait</a></li>
<li class="toctree-l1"><a class="reference internal" href="cdata.html">C Data Interface</a></li>
<li class="toctree-l1 current current-page"><a class="current reference internal" href="#">Arrow JDBC Adapter</a></li>
<li class="toctree-l1"><a class="reference internal" href="reference/index.html">Reference (javadoc)</a></li>
<li class="toctree-l1"><a class="reference external" href="https://arrow.apache.org/cookbook/java/">Cookbook</a></li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="view-this-page">
<a class="muted-link" href="_sources/jdbc.rst.txt" title="View this page">
<svg><use href="#svg-eye"></use></svg>
<span class="visually-hidden">View this page</span>
</a>
</div>
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle">
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon" for="__toc">
<div class="visually-hidden">Toggle table of contents sidebar</div>
<i class="icon"><svg><use href="#svg-toc"></use></svg></i>
</label>
</div>
<article role="main" id="furo-main-content">
<section id="arrow-jdbc-adapter">
<h1>Arrow JDBC Adapter<a class="headerlink" href="#arrow-jdbc-adapter" title="Link to this heading"></a></h1>
<p>The Arrow JDBC Adapter assists with working with JDBC and Arrow
data. Currently, it supports reading JDBC ResultSets into Arrow
VectorSchemaRoots.</p>
<section id="resultset-to-vectorschemaroot-conversion">
<h2>ResultSet to VectorSchemaRoot Conversion<a class="headerlink" href="#resultset-to-vectorschemaroot-conversion" title="Link to this heading"></a></h2>
<p>This can be accessed via the JdbcToArrow class. The resulting
ArrowVectorIterator will convert a ResultSet to Arrow data in batches
of rows.</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">ArrowVectorIterator</span><span class="w"> </span><span class="n">it</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JdbcToArrow</span><span class="p">.</span><span class="na">sqlToArrowVectorIterator</span><span class="p">(</span><span class="n">resultSet</span><span class="p">,</span><span class="w"> </span><span class="n">allocator</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">it</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">it</span><span class="p">.</span><span class="na">next</span><span class="p">();</span>
<span class="w"> </span><span class="c1">// Consume the root…</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The batch size and type mapping can both be customized:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">JdbcToArrowConfig</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">JdbcToArrowConfigBuilder</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="cm">/*calendar=*/</span><span class="kc">null</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setReuseVectorSchemaRoot</span><span class="p">(</span><span class="n">reuseVectorSchemaRoot</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setJdbcToArrowTypeConverter</span><span class="p">((</span><span class="n">jdbcFieldInfo</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">switch</span><span class="w"> </span><span class="p">(</span><span class="n">jdbcFieldInfo</span><span class="p">.</span><span class="na">getJdbcType</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">case</span><span class="w"> </span><span class="n">Types</span><span class="p">.</span><span class="na">BIGINT</span><span class="p">:</span>
<span class="w"> </span><span class="c1">// Assume actual value range is SMALLINT</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrowType</span><span class="p">.</span><span class="na">Int</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">);</span>
<span class="w"> </span><span class="k">default</span><span class="p">:</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}))</span>
<span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">();</span>
<span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">ArrowVectorIterator</span><span class="w"> </span><span class="n">iter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JdbcToArrow</span><span class="p">.</span><span class="na">sqlToArrowVectorIterator</span><span class="p">(</span><span class="n">rs</span><span class="p">,</span><span class="w"> </span><span class="n">config</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">iter</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">iter</span><span class="p">.</span><span class="na">next</span><span class="p">();</span>
<span class="w"> </span><span class="c1">// Consume the root…</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The JDBC type can be explicitly specified, which is useful since JDBC
drivers can give spurious type information. For example, the Postgres
driver has been observed to use Decimal types with scale and precision
0; these cases can be handled by specifying the type explicitly before
reading. Also, some JDBC drivers may return BigDecimal values with
inconsistent scale. A RoundingMode can be set to handle these cases:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">Map</span><span class="o">&lt;</span><span class="n">Integer</span><span class="p">,</span><span class="w"> </span><span class="n">JdbcFieldInfo</span><span class="o">&gt;</span><span class="w"> </span><span class="n">mapping</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HashMap</span><span class="o">&lt;&gt;</span><span class="p">();</span>
<span class="n">mapping</span><span class="p">.</span><span class="na">put</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">JdbcFieldInfo</span><span class="p">(</span><span class="n">Types</span><span class="p">.</span><span class="na">DECIMAL</span><span class="p">,</span><span class="w"> </span><span class="mi">20</span><span class="p">,</span><span class="w"> </span><span class="mi">7</span><span class="p">));</span>
<span class="n">JdbcToArrowConfig</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">JdbcToArrowConfigBuilder</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="cm">/*calendar=*/</span><span class="kc">null</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setBigDecimalRoundingMode</span><span class="p">(</span><span class="n">RoundingMode</span><span class="p">.</span><span class="na">UNNECESSARY</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">setExplicitTypesByColumnIndex</span><span class="p">(</span><span class="n">mapping</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">();</span>
<span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">ArrowVectorIterator</span><span class="w"> </span><span class="n">iter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">JdbcToArrow</span><span class="p">.</span><span class="na">sqlToArrowVectorIterator</span><span class="p">(</span><span class="n">rs</span><span class="p">,</span><span class="w"> </span><span class="n">config</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">iter</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">VectorSchemaRoot</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">iter</span><span class="p">.</span><span class="na">next</span><span class="p">();</span>
<span class="w"> </span><span class="c1">// Consume the root…</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The mapping from JDBC type to Arrow type can be overridden via the
<code class="docutils literal notranslate"><span class="pre">JdbcToArrowConfig</span></code>, but it is not possible to customize the
conversion from JDBC value to Arrow value itself, nor is it possible
to define a conversion for an unsupported type.</p>
<section id="type-mapping">
<h3>Type Mapping<a class="headerlink" href="#type-mapping" title="Link to this heading"></a></h3>
<p>The JDBC to Arrow type mapping can be obtained at runtime from
<a class="reference external" href="https://arrow.apache.org/docs/java/reference/org/apache/arrow/adapter/jdbc/JdbcToArrowUtils.html#getArrowTypeFromJdbcType-org.apache.arrow.adapter.jdbc.JdbcFieldInfo-java.util.Calendar-">JdbcToArrowUtils.getArrowTypeFromJdbcType</a>.</p>
<div class="table-wrapper docutils container">
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>JDBC Type</p></th>
<th class="head"><p>Arrow Type</p></th>
<th class="head"><p>Notes</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>ARRAY</p></td>
<td><p>List</p></td>
<td><p>(1)</p></td>
</tr>
<tr class="row-odd"><td><p>BIGINT</p></td>
<td><p>Int64</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>BINARY</p></td>
<td><p>Binary</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>BIT</p></td>
<td><p>Bool</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>BLOB</p></td>
<td><p>Binary</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>BOOLEAN</p></td>
<td><p>Bool</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>CHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>CLOB</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>DATE</p></td>
<td><p>Date32</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>DECIMAL</p></td>
<td><p>Decimal128</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-even"><td><p>DOUBLE</p></td>
<td><p>Double</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>FLOAT</p></td>
<td><p>Float32</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>INTEGER</p></td>
<td><p>Int32</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>LONGVARBINARY</p></td>
<td><p>Binary</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>LONGNVARCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>LONGVARCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>NCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>NULL</p></td>
<td><p>Null</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>NUMERIC</p></td>
<td><p>Decimal128</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>NVARCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>REAL</p></td>
<td><p>Float32</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>SMALLINT</p></td>
<td><p>Int16</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>STRUCT</p></td>
<td><p>Struct</p></td>
<td><p>(3)</p></td>
</tr>
<tr class="row-odd"><td><p>TIME</p></td>
<td><p>Time32[ms]</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>TIMESTAMP</p></td>
<td><p>Timestamp[ms]</p></td>
<td><p>(4)</p></td>
</tr>
<tr class="row-odd"><td><p>TINYINT</p></td>
<td><p>Int8</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>VARBINARY</p></td>
<td><p>Binary</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>VARCHAR</p></td>
<td><p>Utf8</p></td>
<td></td>
</tr>
</tbody>
</table>
</div>
<ul class="simple">
<li><p>(1) The list value type must be explicitly configured and cannot be
inferred. Use <a class="reference external" href="https://arrow.apache.org/docs/java/reference/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigBuilder.html#setArraySubTypeByColumnIndexMap-java.util.Map-">setArraySubTypeByColumnIndexMap</a> or
<a class="reference external" href="https://arrow.apache.org/docs/java/reference/org/apache/arrow/adapter/jdbc/JdbcToArrowConfigBuilder.html#setArraySubTypeByColumnNameMap-java.util.Map-">setArraySubTypeByColumnNameMap</a>.</p></li>
<li><p>(2) By default, the scale of decimal values must match the scale in
the type exactly; precision is allowed to be any value greater or
equal to the type precision. If there is a mismatch, by default, an
exception will be thrown. This can be configured by setting a
different RoundingMode with setBigDecimalRoundingMode.</p></li>
<li><p>(3) Not fully supported: while the type conversion is defined, the
value conversion is not. See <a class="reference external" href="https://issues.apache.org/jira/browse/ARROW-17006">ARROW-17006</a>.</p></li>
<li><p>(4) If a Calendar is provided, then the timestamp will have the
timezone of the calendar, else it will be a timestamp without
timezone.</p></li>
</ul>
</section>
</section>
<section id="vectorschemaroot-to-preparedstatement-parameter-conversion">
<h2>VectorSchemaRoot to PreparedStatement Parameter Conversion<a class="headerlink" href="#vectorschemaroot-to-preparedstatement-parameter-conversion" title="Link to this heading"></a></h2>
<p>The adapter can bind rows of Arrow data from a VectorSchemaRoot to
parameters of a JDBC PreparedStatement. This can be accessed via the
JdbcParameterBinder class. Each call to next() will bind parameters
from the next row of data, and then the application can execute the
statement, call addBatch(), etc. as desired. Null values will lead to
a setNull call with an appropriate JDBC type code (listed below).</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="kd">final</span><span class="w"> </span><span class="n">JdbcParameterBinder</span><span class="w"> </span><span class="n">binder</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">JdbcParameterBinder</span><span class="p">.</span><span class="na">builder</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span><span class="w"> </span><span class="n">root</span><span class="p">).</span><span class="na">bindAll</span><span class="p">().</span><span class="na">build</span><span class="p">();</span>
<span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">binder</span><span class="p">.</span><span class="na">next</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">statement</span><span class="p">.</span><span class="na">executeUpdate</span><span class="p">();</span>
<span class="p">}</span>
<span class="c1">// Use a VectorLoader to update the root</span>
<span class="n">binder</span><span class="p">.</span><span class="na">reset</span><span class="p">();</span>
<span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">binder</span><span class="p">.</span><span class="na">next</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">statement</span><span class="p">.</span><span class="na">executeUpdate</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The mapping of vectors to parameters, the JDBC type code used by the
converters, and the type conversions themselves can all be customized:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="kd">final</span><span class="w"> </span><span class="n">JdbcParameterBinder</span><span class="w"> </span><span class="n">binder</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">JdbcParameterBinder</span><span class="p">.</span><span class="na">builder</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span><span class="w"> </span><span class="n">root</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">bind</span><span class="p">(</span><span class="cm">/*parameterIndex*/</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="cm">/*columnIndex*/</span><span class="mi">0</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">bind</span><span class="p">(</span><span class="cm">/*parameterIndex*/</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">customColumnBinderInstance</span><span class="p">)</span>
<span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">();</span>
</pre></div>
</div>
<section id="id1">
<h3>Type Mapping<a class="headerlink" href="#id1" title="Link to this heading"></a></h3>
<p>The Arrow to JDBC type mapping can be obtained at runtime via
a method on ColumnBinder.</p>
<div class="table-wrapper docutils container">
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>Arrow Type</p></th>
<th class="head"><p>JDBC Type</p></th>
<th class="head"><p>Notes</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>Binary</p></td>
<td><p>VARBINARY (setBytes)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Bool</p></td>
<td><p>BOOLEAN (setBoolean)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Date32</p></td>
<td><p>DATE (setDate)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Date64</p></td>
<td><p>DATE (setDate)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Decimal128</p></td>
<td><p>DECIMAL (setBigDecimal)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Decimal256</p></td>
<td><p>DECIMAL (setBigDecimal)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>FixedSizeBinary</p></td>
<td><p>BINARY (setBytes)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Float32</p></td>
<td><p>REAL (setFloat)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Int8</p></td>
<td><p>TINYINT (setByte)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Int16</p></td>
<td><p>SMALLINT (setShort)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Int32</p></td>
<td><p>INTEGER (setInt)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Int64</p></td>
<td><p>BIGINT (setLong)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>LargeBinary</p></td>
<td><p>LONGVARBINARY (setBytes)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>LargeUtf8</p></td>
<td><p>LONGVARCHAR (setString)</p></td>
<td><p>(1)</p></td>
</tr>
<tr class="row-even"><td><p>Time[s]</p></td>
<td><p>TIME (setTime)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Time[ms]</p></td>
<td><p>TIME (setTime)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Time[us]</p></td>
<td><p>TIME (setTime)</p></td>
<td></td>
</tr>
<tr class="row-odd"><td><p>Time[ns]</p></td>
<td><p>TIME (setTime)</p></td>
<td></td>
</tr>
<tr class="row-even"><td><p>Timestamp[s]</p></td>
<td><p>TIMESTAMP (setTimestamp)</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-odd"><td><p>Timestamp[ms]</p></td>
<td><p>TIMESTAMP (setTimestamp)</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-even"><td><p>Timestamp[us]</p></td>
<td><p>TIMESTAMP (setTimestamp)</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-odd"><td><p>Timestamp[ns]</p></td>
<td><p>TIMESTAMP (setTimestamp)</p></td>
<td><p>(2)</p></td>
</tr>
<tr class="row-even"><td><p>Utf8</p></td>
<td><p>VARCHAR (setString)</p></td>
<td></td>
</tr>
</tbody>
</table>
</div>
<ul class="simple">
<li><p>(1) Strings longer than Integer.MAX_VALUE bytes (the maximum length
of a Java <code class="docutils literal notranslate"><span class="pre">byte[]</span></code>) will cause a runtime exception.</p></li>
<li><p>(2) If the timestamp has a timezone, the JDBC type defaults to
TIMESTAMP_WITH_TIMEZONE. If the timestamp has no timezone,
technically there is not a correct conversion from Arrow value to
JDBC value, because a JDBC Timestamp is in UTC, and we have no
timezone information. In this case, the default binder will call
<a class="reference external" href="https://docs.oracle.com/en/java/javase/11/docs/api/java.sql/java/sql/PreparedStatement.html#setTimestamp(int,java.sql.Timestamp)">setTimestamp(int, Timestamp)</a>,
which will lead to the driver using the “default timezone” (that of
the Java VM).</p></li>
</ul>
</section>
</section>
</section>
</article>
</div>
<footer>
<div class="related-pages">
<a class="next-page" href="reference/index.html">
<div class="page-info">
<div class="context">
<span>Next</span>
</div>
<div class="title">Java Reference (javadoc)</div>
</div>
<svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
</a>
<a class="prev-page" href="cdata.html">
<svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
<div class="page-info">
<div class="context">
<span>Previous</span>
</div>
<div class="title">C Data Interface</div>
</div>
</a>
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, Apache Arrow Developers
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer">
<div class="toc-sticky toc-scroll">
<div class="toc-title-container">
<span class="toc-title">
On this page
</span>
</div>
<div class="toc-tree-container">
<div class="toc-tree">
<ul>
<li><a class="reference internal" href="#">Arrow JDBC Adapter</a><ul>
<li><a class="reference internal" href="#resultset-to-vectorschemaroot-conversion">ResultSet to VectorSchemaRoot Conversion</a><ul>
<li><a class="reference internal" href="#type-mapping">Type Mapping</a></li>
</ul>
</li>
<li><a class="reference internal" href="#vectorschemaroot-to-preparedstatement-parameter-conversion">VectorSchemaRoot to PreparedStatement Parameter Conversion</a><ul>
<li><a class="reference internal" href="#id1">Type Mapping</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</aside>
</div>
</div><script src="_static/documentation_options.js?v=c4c92189"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/scripts/furo.js?v=5fa4622c"></script>
</body>
</html>