blob: 030a09e4ebca70fc49f9aa548492ec3e5d009a62 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 1.5.4">
<title>odb User Guide</title>
<style>
/**
* @@@ START COPYRIGHT @@@
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @@@ END COPYRIGHT @@@
*/
/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
/* Remove the comments around the @import statement below when using this as a custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
audio,canvas,video{display:inline-block}
audio:not([controls]){display:none;height:0}
[hidden],template{display:none}
script{display:none!important}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
body{margin:0}
a{background:transparent}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif,serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none!important}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
.antialiased,body{-webkit-font-smoothing:antialiased}
img{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#3188ac;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:none}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
/* Defines headings */
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;font-style:normal;color:#3188ac;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
/* Defines the `text` (passthru) format */
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:bold;color:#3188ac}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.no-bullet{list-style:none}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite:before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7;font-weight:bold}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
.clearfix:after,.float-group:after{clear:both}
*:not(pre)>code{font-size:1.0em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
/**:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}*/
pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
.keyseq{color:rgba(51,51,51,.8)}
kbd{display:inline-block;color:rgba(0,0,0,.8);font-size:.75em;line-height:1.4;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:-.15em .15em 0 .15em;padding:.2em .6em .2em .5em;vertical-align:middle;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menu{color:rgba(0,0,0,.8)}
b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
b.button:before{content:"[";padding:0 3px 0 2px}
b.button:after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
#header:after,#content:after,#footnotes:after,#footer:after{clear:both}
#content{margin-top:1.25em}
#content:before{content:none}
/* #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} */
#header>h1:first-child{color:#3188ac;margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span:before{content:"\00a0\2013\00a0"}
#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark:before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber:after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#3188ac;font-size:1.2em}
@media only screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
/* Controls width of panel */
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
#footer-text,#footer_nav{color:rgba(255,255,255,.8);line-height:1.44}
#footer a{color: #990000}
.sect1{padding-bottom:.625em}
@media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}.sect1+.sect1{border-top:1px solid #efefed}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#990000;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif,serif;font-size:1rem;font-weight:bold}
/* Here */
table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
@media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.listingblock>.content{position:relative}
.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
.listingblock:hover code[data-lang]:before{display:block}
.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0}
table.pyhltable td.code{padding-left:.75em;padding-right:0}
pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
pre.pygments .lineno{display:inline-block;margin-right:.25em}
table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
.quoteblock .quoteblock blockquote:before{display:none}
.verseblock{margin:0 1em 1.25em 1em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.05em;color:rgba(0,0,0,.6)}
.quoteblock.abstract{margin:0 0 1.25em 0;display:block}
.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
table.tableblock{max-width:100%;border-collapse:separate}
table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
table.spread{width:100%}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot{border-width:1px 0}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
td>div.verse{white-space:pre}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
ul.inline>li>*{display:block}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1{padding-right:.75em;font-weight:bold}
td.hdlist1,td.hdlist2{vertical-align:top}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
.colist>table tr>td:last-of-type{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none}
span.footnote,span.footnoteref{vertical-align:super;font-size:.875em}
span.footnote a,span.footnoteref a{text-decoration:none}
span.footnote a:active,span.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
#footnotes .footnote{padding:0 .375em;line-height:1.3;font-size:.875em;margin-left:1.2em;text-indent:-1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background-color:#00fafa}
.black{color:#000}
.black-background{background-color:#000}
.blue{color:#0000bf}
.blue-background{background-color:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background-color:#fa00fa}
.gray{color:#606060}
.gray-background{background-color:#7d7d7d}
.green{color:#006000}
.green-background{background-color:#007d00}
.lime{color:#00bf00}
.lime-background{background-color:#00fa00}
.maroon{color:#600000}
.maroon-background{background-color:#7d0000}
.navy{color:#000060}
.navy-background{background-color:#00007d}
.olive{color:#606000}
.olive-background{background-color:#7d7d00}
.purple{color:#600060}
.purple-background{background-color:#7d007d}
.red{color:#bf0000}
.red-background{background-color:#fa0000}
.silver{color:#909090}
.silver-background{background-color:#bcbcbc}
.teal{color:#006060}
.teal-background{background-color:#007d7d}
.white{color:#bfbfbf}
.white-background{background-color:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background-color:#fafa00}
span.icon>.fa{cursor:default}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]:after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
h1,h2{letter-spacing:-.01em}
dt,th.tableblock,td.content{text-rendering:optimizeLegibility}
p,td.content{letter-spacing:-.01em}
p strong,td.content strong{letter-spacing:-.005em}
p,blockquote,dt,td.content{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@media print{@page{margin:1.25cm .75cm}
*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]:after{content:" (" attr(title) ")"}
pre,blockquote,tr,img{page-break-inside:avoid}
thead{display:table-header-group}
img{max-width:100%!important}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
.sect1{padding-bottom:0!important}
.sect1+.sect1{border:0!important}
#header>h1:first-child{margin-top:1.25rem}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span:before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]:before{display:block}
#footer{background:none!important;padding:0 .9375em}
#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
div.paragraph.indented p {padding-left: 3em;}
div.paragraph.indented2 p {padding-left: 6em;}
div.paragraph.indented3 p {padding-left: 9em;}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
<style>
/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
/*pre.CodeRay {background-color:#f7f7f8;}*/
.CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
.CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
.CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
table.CodeRay td{vertical-align: top;line-height:1.45}
table.CodeRay td.line-numbers{text-align:right}
table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
table.CodeRay td.code{padding:0 0 0 .5em}
table.CodeRay td.code>pre{padding:0}
.CodeRay .debug{color:#fff !important;background:#000080 !important}
.CodeRay .annotation{color:#007}
.CodeRay .attribute-name{color:#000080}
.CodeRay .attribute-value{color:#700}
.CodeRay .binary{color:#509}
.CodeRay .comment{color:#998;font-style:italic}
.CodeRay .char{color:#04d}
.CodeRay .char .content{color:#04d}
.CodeRay .char .delimiter{color:#039}
.CodeRay .class{color:#458;font-weight:bold}
.CodeRay .complex{color:#a08}
.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
.CodeRay .color{color:#099}
.CodeRay .class-variable{color:#369}
.CodeRay .decorator{color:#b0b}
.CodeRay .definition{color:#099}
.CodeRay .delimiter{color:#000}
.CodeRay .doc{color:#970}
.CodeRay .doctype{color:#34b}
.CodeRay .doc-string{color:#d42}
.CodeRay .escape{color:#666}
.CodeRay .entity{color:#800}
.CodeRay .error{color:#808}
.CodeRay .exception{color:inherit}
.CodeRay .filename{color:#099}
.CodeRay .function{color:#900;font-weight:bold}
.CodeRay .global-variable{color:#008080}
.CodeRay .hex{color:#058}
.CodeRay .integer,.CodeRay .float{color:#099}
.CodeRay .include{color:#555}
.CodeRay .inline{color:#000}
.CodeRay .inline .inline{background:#ccc}
.CodeRay .inline .inline .inline{background:#bbb}
.CodeRay .inline .inline-delimiter{color:#d14}
.CodeRay .inline-delimiter{color:#d14}
.CodeRay .important{color:#555;font-weight:bold}
.CodeRay .interpreted{color:#b2b}
.CodeRay .instance-variable{color:#008080}
.CodeRay .label{color:#970}
.CodeRay .local-variable{color:#963}
.CodeRay .octal{color:#40e}
.CodeRay .predefined{color:#369}
.CodeRay .preprocessor{color:#579}
.CodeRay .pseudo-class{color:#555}
.CodeRay .directive{font-weight:bold}
.CodeRay .type{font-weight:bold}
.CodeRay .predefined-type{color:inherit}
.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
.CodeRay .key{color:#808}
.CodeRay .key .delimiter{color:#606}
.CodeRay .key .char{color:#80f}
.CodeRay .value{color:#088}
.CodeRay .regexp .delimiter{color:#808}
.CodeRay .regexp .content{color:#808}
.CodeRay .regexp .modifier{color:#808}
.CodeRay .regexp .char{color:#d14}
.CodeRay .regexp .function{color:#404;font-weight:bold}
.CodeRay .string{color:#d20}
.CodeRay .string .string .string{background:#ffd0d0}
.CodeRay .string .content{color:#d14}
.CodeRay .string .char{color:#d14}
.CodeRay .string .delimiter{color:#d14}
.CodeRay .shell{color:#d14}
.CodeRay .shell .delimiter{color:#d14}
.CodeRay .symbol{color:#990073}
.CodeRay .symbol .content{color:#a60}
.CodeRay .symbol .delimiter{color:#630}
.CodeRay .tag{color:#008080}
.CodeRay .tag-special{color:#d70}
.CodeRay .variable{color:#036}
.CodeRay .insert{background:#afa}
.CodeRay .delete{background:#faa}
.CodeRay .change{color:#aaf;background:#007}
.CodeRay .head{color:#f8f;background:#505}
.CodeRay .insert .insert{color:#080}
.CodeRay .delete .delete{color:#800}
.CodeRay .change .change{color:#66f}
.CodeRay .head .head{color:#f4f}
</style>
</head>
<body class="book toc2 toc-left">
<div id="header">
<h1>odb User Guide</h1>
<div class="details">
<span id="revnumber">version 2.4.0</span>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_about_this_document">1. About This Document</a>
<ul class="sectlevel2">
<li><a href="#_intended_audience">1.1. Intended Audience</a></li>
<li><a href="#_new_and_changed_information">1.2. New and Changed Information</a></li>
<li><a href="#_notation_conventions">1.3. Notation Conventions</a></li>
<li><a href="#_comments_encouraged">1.4. Comments Encouraged</a></li>
</ul>
</li>
<li><a href="#_introduction">2. Introduction</a>
<ul class="sectlevel2">
<li><a href="#_what_is_odb">2.1. What is odb</a></li>
</ul>
</li>
<li><a href="#_installation_and_configuration">3. Installation and Configuration</a></li>
<li><a href="#_basic_concepts">4. Basic Concepts</a>
<ul class="sectlevel2">
<li><a href="#_get_help">4.1. Get Help</a></li>
<li><a href="#_connect_to_database">4.2. Connect to Database</a></li>
<li><a href="#_list_odbc_drivers_and_data_sources">4.3. List ODBC Drivers and Data Sources</a></li>
<li><a href="#_obtain_database_information">4.4. Obtain Database Information</a></li>
<li><a href="#_list_database_objects">4.5. List Database Objects</a></li>
<li><a href="#_perform_actions_on_multiple_database_objects">4.6. Perform Actions on Multiple Database Objects</a></li>
<li><a href="#_run_commands_and_scripts">4.7. Run Commands and Scripts</a></li>
<li><a href="#_shell_script_here_document_syntax">4.8. Shell Script "here document" Syntax</a></li>
<li><a href="#_parallelize_multiple_commands_and_scripts">4.9. Parallelize Multiple Commands and Scripts</a></li>
<li><a href="#_limit_number_of_odb_threads">4.10. Limit Number of odb Threads</a></li>
<li><a href="#_change_executions_distributed_across_threads">4.11. Change Executions Distributed Across Threads</a></li>
<li><a href="#concepts_load_balancing">4.12. Dynamic Load Balancing</a></li>
<li><a href="#_use_variables_in_odb_scripts">4.13. Use Variables in odb Scripts</a></li>
<li><a href="#_thread_id_thread_execution_and_script_command">4.14. Thread ID, Thread Execution#, and Script Command#</a></li>
<li><a href="#_validate_sql_scripts">4.15. Validate SQL Scripts</a></li>
<li><a href="#_different_data_sources_for_different_threads">4.16. Different Data Sources for Different Threads</a></li>
<li><a href="#_format_query_results">4.17. Format Query Results</a></li>
<li><a href="#_extract_table_ddl">4.18. Extract Table DDL</a></li>
</ul>
</li>
<li><a href="#_load_extract_copy">5. Load, Extract, Copy</a>
<ul class="sectlevel2">
<li><a href="#_load_files">5.1. Load Files</a>
<ul class="sectlevel3">
<li><a href="#_data_loading_operators">5.1.1. Data Loading Operators</a></li>
</ul>
</li>
<li><a href="#load_map_fields">5.2. Map Source File Fields to Target Table Columns</a></li>
<li><a href="#load_mapfiles_ignore">5.3. Use mapfiles to Ignore and/or Transform Fields When Loading</a></li>
<li><a href="#_use_mapfiles_to_load_fixed_format_files">5.4. Use mapfiles to Load Fixed Format Files</a></li>
<li><a href="#_generate_and_load_data">5.5. Generate and Load Data</a></li>
<li><a href="#load_default_values">5.6. Load Default Values</a></li>
<li><a href="#load_binary_files">5.7. Load Binary Files</a></li>
<li><a href="#load_xml_files">5.8. Load XML Files</a>
<ul class="sectlevel3">
<li><a href="#_load_xml_files_where_data_is_stored_in_element_nodes">5.8.1. Load XML Files Where Data is Stored in Element Nodes</a></li>
<li><a href="#_load_xml_files_where_data_is_stored_in_attribute_nodes">5.8.2. Load XML Files Where Data is Stored in Attribute Nodes</a></li>
</ul>
</li>
<li><a href="#_reduce_the_odbc_buffer_size">5.9. Reduce the ODBC Buffer Size</a></li>
<li><a href="#_extract_tables">5.10. Extract Tables</a>
<ul class="sectlevel3">
<li><a href="#_extraction_options">5.10.1. Extraction Options</a></li>
</ul>
</li>
<li><a href="#_extract_a_list_of_tables">5.11. Extract a List of Tables</a></li>
<li><a href="#_copy_tables_from_one_database_to_another">5.12. Copy Tables From One Database to Another</a>
<ul class="sectlevel3">
<li><a href="#_copy_operators">5.12.1. Copy Operators</a></li>
</ul>
</li>
<li><a href="#_copy_a_list_of_tables">5.13. Copy a List of Tables</a></li>
<li><a href="#_case_sensitive_table_and_column_names">5.14. Case-Sensitive Table and Column Names</a></li>
<li><a href="#_determine_appropriate_number_of_threads_for_load_extract_copy_diff">5.15. Determine Appropriate Number of Threads for Load/Extract/Copy/Diff</a></li>
<li><a href="#_integrating_with_hadoop">5.16. Integrating With Hadoop</a></li>
</ul>
</li>
<li><a href="#_comparing_tables_technology_preview">6. Comparing Tables (Technology Preview)</a>
<ul class="sectlevel2">
<li><a href="#_diff_operators">6.1. Diff Operators</a></li>
</ul>
</li>
<li><a href="#_odb_as_a_query_driver_technology_preview">7. odb as a Query Driver (Technology Preview)</a>
<ul class="sectlevel2">
<li><a href="#_getting_csv_output">7.1. Getting CSV Output</a></li>
<li><a href="#_assign_label_to_a_query">7.2. Assign Label to a Query</a></li>
<li><a href="#query_driver_all_scripts_path">7.3. Run All Scripts With a Given Path</a></li>
<li><a href="#_randomizing_execution_order">7.4. Randomizing Execution Order</a></li>
<li><a href="#_defining_a_timeout">7.5. Defining a Timeout</a></li>
<li><a href="#_simulating_user_thinking_time">7.6. Simulating User Thinking Time</a></li>
<li><a href="#_starting_threads_gracefully">7.7. Starting Threads Gracefully</a></li>
<li><a href="#_re_looping_a_given_workload">7.8. Re-looping a Given Workload</a></li>
</ul>
</li>
<li><a href="#_odb_as_a_sql_interpreter_technology_preview">8. odb as a SQL Interpreter (Technology Preview)</a>
<ul class="sectlevel2">
<li><a href="#_main_odb_sql_interpreter_features">8.1. Main odb SQL Interpreter Features</a>
<ul class="sectlevel3">
<li><a href="#_odb_sql_interpreter_help">8.1.1. odb SQL Interpreter help</a></li>
</ul>
</li>
<li><a href="#sql_run_commands">8.2. Run Commands When the Interpreter Starts</a></li>
<li><a href="#sql_custom_prompt">8.3. Customizing the Interpreter Prompt</a></li>
</ul>
</li>
<li><a href="#_appendixes">9. Appendixes</a>
<ul class="sectlevel2">
<li><a href="#_a_troubleshooting">9.1. A. Troubleshooting</a></li>
<li><a href="#_b_develop_and_test_odb">9.2. B. Develop and Test odb</a>
<ul class="sectlevel3">
<li><a href="#_develop">9.2.1. Develop</a></li>
<li><a href="#_test">9.2.2. Test</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p><strong>License Statement</strong></p>
</div>
<div class="paragraph">
<p>Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file
distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at <a href="http://www.apache.org/licenses/LICENSE-2.0" class="bare">http://www.apache.org/licenses/LICENSE-2.0</a></p>
</div>
<div class="paragraph">
<p>Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.</p>
</div>
<div style="page-break-after: always;"></div>
<div class="paragraph">
<p><strong>Revision History</strong></p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Version</th>
<th class="tableblock halign-left valign-top">Date</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">2.2.0</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">2.1.0</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">May 1, 2017</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">2.0.1</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">July 7, 2016</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">2.0.0</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">June 6, 2016</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">1.3.0</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">January, 2016</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="sect1">
<h2 id="_about_this_document">1. About This Document</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This guide describes how to use odb, a multi-threaded, ODBC-based command-line tool, to perform various operations on a Trafodion
database.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
In the current release of Trafodion, only loading, extracting, and copying data operations are production ready, meaning that that have
been fully tested and are ready to be used in a production environment.<br>
<br>
Other features are designated as <em>Technology Preview</em> meaning that they have not been fully tested and are not ready for production use.
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="_intended_audience">1.1. Intended Audience</h3>
<div class="paragraph">
<p>This guide is intended for database administrators and other users who want to run scripts that operate on a Trafodion database, primarily for
parallel data loading.</p>
</div>
</div>
<div class="sect2">
<h3 id="_new_and_changed_information">1.2. New and Changed Information</h3>
<div class="paragraph">
<p>This manual guide is new.</p>
</div>
</div>
<div class="sect2">
<h3 id="_notation_conventions">1.3. Notation Conventions</h3>
<div class="paragraph">
<p>This list summarizes the notation conventions for syntax presentation in this manual.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>UPPERCASE LETTERS</p>
<div class="paragraph">
<p>Uppercase letters indicate keywords and reserved words. Type these items exactly as shown. Items not enclosed in brackets are required.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">SELECT</code></pre>
</div>
</div>
</li>
<li>
<p>lowercase letters</p>
<div class="paragraph">
<p>Lowercase letters, regardless of font, indicate variable items that you supply. Items not enclosed in brackets are required.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">file-name</code></pre>
</div>
</div>
</li>
</ul>
</div>
<div style="page-break-after: always;"></div>
<div class="ulist">
<ul>
<li>
<p>&#91; &#93; Brackets</p>
<div class="paragraph">
<p>Brackets enclose optional syntax items.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">DATETIME [start-field TO] end-field</code></pre>
</div>
</div>
<div class="paragraph">
<p>A group of items enclosed in brackets is a list from which you can choose one item or none.</p>
</div>
<div class="paragraph">
<p>The items in the list can be arranged either vertically, with aligned brackets on each side of the list, or horizontally, enclosed in a pair of brackets and separated by vertical lines.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">DROP SCHEMA schema [CASCADE]
DROP SCHEMA schema [ CASCADE | RESTRICT ]</code></pre>
</div>
</div>
</li>
<li>
<p>{ } Braces</p>
<div class="paragraph">
<p>Braces enclose required syntax items.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">FROM { grantee [, grantee ] ... }</code></pre>
</div>
</div>
<div class="paragraph">
<p>A group of items enclosed in braces is a list from which you are required to choose one item.</p>
</div>
<div class="paragraph">
<p>The items in the list can be arranged either vertically, with aligned braces on each side of the list, or horizontally, enclosed in a pair of braces and separated by vertical lines.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">INTERVAL { start-field TO end-field }
{ single-field }
INTERVAL { start-field TO end-field | single-field }</code></pre>
</div>
</div>
</li>
<li>
<p>| Vertical Line</p>
<div class="paragraph">
<p>A vertical line separates alternatives in a horizontal list that is enclosed in brackets or braces.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">{expression | NULL}</code></pre>
</div>
</div>
</li>
</ul>
</div>
<div style="page-break-after: always;"></div>
<div class="ulist">
<ul>
<li>
<p>&#8230; Ellipsis</p>
<div class="paragraph">
<p>An ellipsis immediately following a pair of brackets or braces indicates that you can repeat the enclosed sequence of syntax items any number of times.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">ATTRIBUTE[S] attribute [, attribute] ...
{, sql-expression } ...</code></pre>
</div>
</div>
<div class="paragraph">
<p>An ellipsis immediately following a single syntax item indicates that you can repeat that syntax item any number of times.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">expression-n ...</code></pre>
</div>
</div>
</li>
<li>
<p>Punctuation</p>
<div class="paragraph">
<p>Parentheses, commas, semicolons, and other symbols not previously described must be typed as shown.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">DAY (datetime-expression)
@script-file</code></pre>
</div>
</div>
<div class="paragraph">
<p>Quotation marks around a symbol such as a bracket or brace indicate the symbol is a required character that you must type as shown.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">&quot;{&quot; module-name [, module-name] ... &quot;}&quot;</code></pre>
</div>
</div>
</li>
</ul>
</div>
<div style="page-break-after: always;"></div>
<div class="ulist">
<ul>
<li>
<p>Item Spacing</p>
<div class="paragraph">
<p>Spaces shown between items are required unless one of the items is a punctuation symbol such as a parenthesis or a comma.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">DAY (datetime-expression) DAY(datetime-expression)</code></pre>
</div>
</div>
<div class="paragraph">
<p>If there is no space between two items, spaces are not permitted. In this example, no spaces are permitted between the period and any other items:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">myfile.sh</code></pre>
</div>
</div>
</li>
<li>
<p>Line Spacing</p>
<div class="paragraph">
<p>If the syntax of a command is too long to fit on a single line, each continuation line is indented three spaces and is separated from the preceding line by a blank line.</p>
</div>
<div class="paragraph">
<p>This spacing distinguishes items in a continuation line from items in a vertical list of selections.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">match-value [NOT] LIKE _pattern
[ESCAPE esc-char-expression]</code></pre>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_comments_encouraged">1.4. Comments Encouraged</h3>
<div class="paragraph">
<p>We encourage your comments concerning this document. We are committed to providing documentation that meets your
needs. Send any errors found, suggestions for improvement, or compliments to <a href="mailto:user@trafodion.apache.org">user@trafodion.apache.org</a>.</p>
</div>
<div class="paragraph">
<p>Include the document title and any comment, error found, or suggestion for improvement you have concerning this document.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_introduction">2. Introduction</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_what_is_odb">2.1. What is odb</h3>
<div class="paragraph">
<p>odb is a platform independent, multi-threaded, ODBC command-line tool you can use as a:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Parallel data loader/extractor</p>
</li>
<li>
<p>Query driver (Technology Preview)</p>
</li>
<li>
<p>SQL interpreter (Technology Preview)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>odb is written in ANSI C. Currently, odb is available only in a 64-bit version for the Linux platform,
linked to the unixODBC driver manager.</p>
</div>
<div class="paragraph">
<p>odb executables use the following naming convention, <code><strong><em>odbAABCC</em></strong></code>, where:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code><strong>AA</strong></code> can be 64 (bit) (32 bit is not currently supported).</p>
</li>
<li>
<p><code><strong>B</strong></code> identifies the platform/compiler:</p>
</li>
<li>
<p><code>l</code> = Linux/gcc</p>
</li>
<li>
<p><code>w</code> = Windows/MS Visual Studio (not yet tested)</p>
</li>
<li>
<p><code><strong>CC</strong></code> identifies the ODBC Driver Manager to which odb was linked:</p>
</li>
<li>
<p><code>uo</code> = unixODBC Driver Manager</p>
</li>
<li>
<p><code>ms</code> = Microsoft ODBC Driver Manager (not yet tested)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>So, for example:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code><strong>odb64luo</strong></code> is the 64-bit executable for Linux linked with the unixODBC Driver Manager.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>This document contains examples run with the <code><strong>odb64luo</strong></code> executable.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_installation_and_configuration">3. Installation and Configuration</h2>
<div class="sectionbody">
<div class="paragraph">
<p>See the <a href="http://trafodion.apache.org/docs/odb/index.html">Trafodion Client Installation Guide</a> for install instructions.</p>
</div>
<div class="paragraph">
<p>Refer to the <a href="http://www.unixodbc.org/doc/">unixODBC documentation</a> for additional
information for <code>unixODBC</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_basic_concepts">4. Basic Concepts</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_get_help">4.1. Get Help</h3>
<div class="paragraph">
<p>The following command shows the odb help:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -h
odb version 1.3.0
Build: linux, amd64, gcc generic m64, uodbc, mreadline, dynamic gzip, dynamic libhdfs, dynamic libxml2 [Mar 30 2015 00:29:25]
-h: print this help
-version: print odb version and exit
-lsdrv: list available drivers @ Driver Manager level
-lsdsn: list available Data Sources
Connection related options. You can connect using either:
-u User: (default $ODB_USER variable)
-p Password: (default $ODB_PWD variable)
-d Data_Source_Name: (default $ODB_DSN variable)
-ca Connection_Attributes (normally used instead of -d DSN)
-U sets SQL_TXN_READ_UNCOMMITTED isolation level
-ndsn [+]&lt;number&gt;: adds 1 to &lt;number&gt; to DSN
-nps &lt;nbytes&gt;[:&lt;nbytes&gt;]: specify source[:target] network packet size
SQL interpreter options:
-I [$ODB_INI SECTION]: interactive mode shell
-noconnect: do not connect on startup General options:
-q [cmd|res|all|off]: do not print commands/results/both
-i [TYPE[MULT,WIDE_MULT]:CATALOG.SCHEMA[.TABLE]]: lists following object types:
(t)ables, (v)iews, s(y)nonyns, (s)chemas, (c)atalogs, syst(e)m tables
(l)ocal temp, (g)lobal temp, (m)at views, (M)mat view groups, (a)lias
(A)ll object types, (T)table desc, (D)table DDL, (U) table DDL with multipliers
-r #rowset: rowset to be used insert/selects (default 100)
-soe: Stop On Error (script execution/loading task)
-N : Null run. Doesn't SQLExecute statements
-v : be verbose
-vv : Print execution table
-noschema : do not use schemas: CAT.OBJ instead of CAT.SCH.OBJ
-nocatalog : do not use catalogs: SCH.OBJ instead of CAT.SCH.OBJ
-nocatnull : like -nocatalog but uses NULL instead of empty CAT strings
-ucs2toutf8 : set UCS-2 to UTF-8 conversion in odb
-var var_name var_value: set user defined variables
-ksep char/code: Thousands Separator Character (default ',')
-dsep char/code: Decimal Separator Character (default '.')
SQL execution options [connection required]:
-x [#inst:]'command': runs #inst (default 1) command instances
-f [#inst:]'script': runs #inst (default 1) script instances
-P script_path_regexp: runs in parallel scripts_path_regexp if script_path_regexp ends with / all files in that dir
-S script_path_regexp: runs serially scripts_path_regexp if script_path_regexp ends with / all files in that dir
-L #loops: runs everything #loops times
-T max_threads: max number of execution threads
-dlb: use Dynamic Load Balancing
-timeout #seconds: stops everything after #seconds (no Win32)
-delay #ms: delay (ms) before starting next thread
-ldelay #ms: delay (ms) before starting next loop in a thread
-ttime #ms[:ms]: delay (ms) before starting next command in a thread random delay if a [min:max] range is specified
-F #records: max rows to fetch
-c : output in csv format
-b : print start time in the headers when CSV output
-pcn: Print Column Names
-plm: Print Line Mode
-fs char/code: Field Sep &lt;char&gt; ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
-rs char/code: Rec Sep &lt;char&gt; ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
-sq char/code: String Qualifier (default none)
-ec char/code: Escape Character (default '\')
-ns nullstring: print nullstring when a field is NULL
-trim: Trim leading/trailing white spaces from txt cols
-drs: describe result set (#cols, data types...) for each Q)
-hint: do not remove C style comments (treat them as hints)
-casesens: set case sensitive DB
-Z : shuffle the execution table randomizing Qs start order
Data loading options [connection required]:
-l src=[-]file:tgt=table[:map=mapfile][:fs=fieldsep][:rs=recsep][:soe]
[:skip=linestoskip][:ns=nullstring][:ec=eschar][:sq=stringqualifier]
[:pc=padchar][:em=embedchar][:errmax=#max_err][:commit=auto|end|#rows|x#rs]
[:rows=#rowset][:norb][:full][:max=#max_rec][:truncate][:show][:bpc=#][:bpwc=#]
[:nomark][:parallel=number][:iobuff=#size][:buffsz=#size]][:fieldtrunc={0-4}]
[:pre={@sqlfile}|{[sqlcmd]}][:post={@sqlfile}|{[sqlcmd]}][:ifempty]
[:direct][:bad=[+]badfile][:tpar=#tables][:maxlen=#bytes][:time][:loadcmd=IN|UP|UL]
[:xmltag=[+]element][:xmlord][:xmldump]
Defaults/notes:
* src file: local file or {hdfs,mapr}[@host,port[,huser]].&lt;HDFS_PATH&gt;
* fs: default ','. Also &lt;ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
* rs: default '\n'. Also &lt;ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
* ec: default '\'. Also &lt;ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
* pc: no default. Also &lt;ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
* direct: only for Vertica databases
* bpc: default 1,bpwc: default 4
* loadcmd: default IN. only for {project-name} databases
Data extraction options [connection required]:
-e {src={table|-file}|sql=&lt;custom sql&gt;}:tgt=[+]file[:pwhere=where_cond]
[:fs=fieldsep][:rs=recsep][:sq=stringqualifier][:ec=escape_char][:soe]
[:ns=nullstring][es=emptystring][:rows=#rowset][:nomark][:binary][:bpc=#][:bpwc=#]
[:max=#max_rec][:[r]trim[+]][:cast][:multi][parallel=number][:gzip[=lev]]
[:splitby=column][:uncommitted][:iobuff=#size][hblock=#size][:ucs2toutf8]
[:pre={@sqlfile}|{[sqlcmd]}[:mpre={@sqlfile}|{[sqlcmd]}[:post={@sqlfile}|{[sqlcmd]}]
[tpar=#tables][:time][:cols=[-]columns]][:maxlen=#bytes][:xml]
Defaults/notes:
* tgt file: local file or {hdfs,mapr}.[@host,port[,huser]].&lt;HDFS_PATH&gt;
* fs: default ','. Also &lt;ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
* rs: default '\n'. Also &lt;ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
* ec: default '\'. Also &lt;ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
* sq: no default. Also &lt;ASCII_dec&gt; 0&lt;ASCII_OCT&gt; X&lt;ASCII_HEX&gt;
* gzip compression level between 0 and 9
* bpc: default 1,bpwc: default 4
Data copy options [connection required]:
-cp src={table|-file:tgt=schema[.table][pwhere=where_cond][:soe][:roe=#][:roedel=#ms]
[:truncate][:rows=#rowset][:nomark][:max=#max_rec][:bpc=#][:bpwc=#][:[r]trim[+]]
[:parallel=number][errmax=#max_err][:commit=auto|end|#rows|x#rs][:time] ][:cast]
[:direct][:uncommitted][:norb][:splitby=column][:pre={@sqlfile}|{[sqlcmd]}]
[:post={@sqlfile}|{[sqlcmd]}][:mpre={@sqlfile}|{[sqlcmd]}][:ifempty]
[:loaders=#loaders][:tpar=#tables][:cols=[-]columns][:errdmp=file] ][:loadcmd=IN|UP|UL]
[sql={[sqlcmd]|@sqlfile|-file}[:bind=auto|char|cdef][:seq=field#[,start]]
[tmpre={@sqlfile}|{[sqlcmd]}][:ucs2toutf8=[skip,force,cpucs2,qmark]]
Defaults/notes:
* loaders: default 2 load threads for each 'extractor'
* direct: only work if target database is Vertica
* ucs2toutf8: default is 'skip'
* roe: default 3 if no arguments
* bpc: default 1,bpwc: default 4
* loadcmd: default IN. only for {project-name} databases
Data pipe options [connection required]:
-pipe sql={[sqlcmd]|@sqlscript|-file}:tgtsql={@sqlfile|[sqlcmd]}[:soe]
[:rows=#rowset][:nomark][:max=#max_rec][:bpc=#][:bpwc=#][:errdmp=file]
[:parallel=number][errmax=#max_err][:commit=auto|end|#rows|x#rs][:time]
[:pre={@sqlfile}|{[sqlcmd]}][:post={@sqlfile}|{[sqlcmd]}]
[:mpre={@sqlfile}|{[sqlcmd]}][:tmpre={@sqlfile}|{[sqlcmd]}]
[:loaders=#loaders][:tpar=#tables][:bind=auto|char|cdef]
Defaults/notes:
* loaders: default 1 load threads for each extraction thread
* bpc: default 1,bpwc: default 4</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">Table diff options [connection required]:
-diff src={table|-file}:tgt=table:[key=columns][:output=[+]file][:pwhere=where_cond]
[:pwhere=where_cond][:nomark][:rows=#rowset][:odad][:fs=fieldsep][:time][trim[+]]
[:rs=recsep][:quick][:splitby=column][:parallel=number][:max=#max_rec]
[:print=[I][D][C]][:ns=nullstring][:es=emptystring][:bpc=#][:bpwc=#][:uncommitted]
[:pre={@sqlfile}|{[sqlcmd]}][:post={@sqlfile}|{[sqlcmd]}][tpar=#tables]
Defaults/notes:
* bpc: default 1,bpwc: default 4
* print: default is Inserted Deleted Changed</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_connect_to_database">4.2. Connect to Database</h3>
<div class="paragraph">
<p>odb uses standard ODBC APIs to connect to a database.</p>
</div>
<div class="paragraph">
<p>Normally you have to provide the following information: user, password and ODBC data source.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">$ ./odb64luo –u user –p password –d dsn ...</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can provide Driver-specific connection attributes using th <code>-ca</code> command line option.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Command-line passwords are protected against <code>ps -ef</code> sniffing attacks under *nix. You can safely pass your
password via <code>–p</code>. An alternative approach is to use environment variables or the odb password prompt (see below).
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>odb will use the following environment variables (if defined):</p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 15.7894%;">
<col style="width: 52.6315%;">
<col style="width: 31.5791%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Variable</th>
<th class="tableblock halign-left valign-top">Meaning</th>
<th class="tableblock halign-left valign-top">Corresponding Command-Line Option</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ODB_USER</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">User name to use for database connections</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-u &lt;user&gt;</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ODB_PWD</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Password for database connections</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-p &lt;passwd&gt;</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ODB_DSN</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">DSN for database connection</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-d &lt;dsn&gt;</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ODB_INI</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Init file for interactive shell</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ODB_HIST</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">history file name to save command history on exit</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody>
</table>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Command-line options take precedence over environment variables.
</td>
</tr>
</table>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_list_odbc_drivers_and_data_sources">4.3. List ODBC Drivers and Data Sources</h3>
<div class="paragraph">
<p>You can list available drivers with <code>-lsdrv</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -lsdrv
Trafodion - Description=Trafodion ODBC Stand Alone Driver
...</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can list locally configured data sources with <code>-lsdsn</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -lsdsn
traf - Trafodion
VMFELICI – Vertica
...</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_obtain_database_information">4.4. Obtain Database Information</h3>
<div class="paragraph">
<p>The <code>-i</code> option allows you to get information about the database you’re connecting to as well as the ODBC driver.
It’s a simple way to check your credentials and database connection.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/mauro/odb $ ./odb64luo -u xxx -p xxx -d traf -i
odb [2015-04-20 21:20:47]: starting ODBC connection(s)... 0
[odb version 1.3.0]
Build: linux, amd64, gcc generic m64, uodbc, mreadline, dynamic gzip, dynamic libhdfs, dynamic libxml2 [Apr 8 2015 16:47:49]
DBMS product name (SQL_DBMS_NAME) : Trafodion
DBMS product version (SQL_DBMS_VER) : 01.03.0000
Database name (SQL_DATABASE_NAME) : TRAFODION
Server name (SQL_SERVER_NAME) : --name--
Data source name (SQL_DATA_SOURCE_NAME) : traf
Data source RO (SQL_DATA_SOURCE_READ_ONLY) : N
ODBC Driver name (SQL_DRIVER_NAME) : libhpodbc64.so
ODBC Driver version (SQL_DRIVER_VER) : 03.00.0000
ODBC Driver level (SQL_DRIVER_ODBC_VER) : 03.51
ODBC Driver Manager version (SQL_DM_VER) : 03.52.0002.0002
ODBC Driver Manager level (SQL_ODBC_VER) : 03.52
Connection Packet Size (SQL_ATTR_PACKET_SIZE): 0
odb [2015-04-20 21:20:48]: exiting. Session Elapsed time 0.229 seconds (00:00:00.229)</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_list_database_objects">4.5. List Database Objects</h3>
<div class="paragraph">
<p>The previous section used the <code>-i</code> option without any argument.</p>
</div>
<div class="paragraph">
<p>This option accepts arguments with the following syntax:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">[TYPE:][CATALOG.SCHEMA][.OBJECT]</code></pre>
</div>
</div>
<div class="paragraph">
<p>where type can be:</p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 40%;">
<col style="width: 60%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Type</th>
<th class="tableblock halign-left valign-top">Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>&lt;missing&gt;</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All database object types</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>A:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">All database object types</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>t:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Tables</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>v:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Views</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>a:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Aliases</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>y:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Synonyms</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>l:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Local Temporary</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>g:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Global Temporary</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>m:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Materialized views</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>M:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Materialized view groups</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>s:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Schemas</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>c:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Catalogs</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>T:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Table descriptions</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>D:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Table DDL</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>U[x,y]:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Table DDL multiplying wide columns by Y and non-wide columns by X</p></td>
</tr>
</tbody>
</table>
<div style="page-break-after: always;"></div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 40%;">
<col style="width: 60%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Example</th>
<th class="tableblock halign-left valign-top">Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-i c:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List all catalogs.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-i s:</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List all schemas.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-i TRAFODION.MFTEST</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List all objects in <code>TRAFODION.MFTEST</code> schema.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-i t:TRAFODION.MFTEST</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List all tables in <code>TRAFODION.MFTEST</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-i t:TRAFODION.MFTEST.A%</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List all tables in <code>TRAFODION.MFTEST</code> schema staring with <code>A</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-i v:TRAFODION.MFTEST</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List all views in <code>TRAFODION.MFTEST</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-i v:TRAFODION.MFTEST.%_V</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">List all views in <code>TRAFODION.MFTEST</code> ending with <code>_V</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>-i T:TRAFODION.MFTEST.STG%</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Describe all tables starting with <code>STG</code> in <code>TRAFODION.MFTEST</code>.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p><strong>Extended Examples</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/mauro/odb $ ./odb64luo -u MFELICI -p xxx -d MFELICI -i T:TRAFODION.MAURIZIO.T%
odb [2011-12-07 14:43:51]: starting (1) ODBC connection(s)... 1
Describing: TRAFODION.MAURIZIO.T1
+------+--------------+----+-------+-------+
|COLUMN|TYPE |NULL|DEFAULT|INDEX |
+------+--------------+----+-------+-------+
|ID |INTEGER SIGNED|YES | | |
|NAME |CHAR(10) |YES | | |
|LASTN |VARCHAR(20) |YES | | |
+------+--------------+----+-------+-------+
Describing: TRAFODION.MAURIZIO.T11
+------+--------------+----+-------+-------+
|COLUMN|TYPE |NULL|DEFAULT|INDEX |
+------+--------------+----+-------+-------+
|ID |INTEGER SIGNED|NO | |T11 1 U|
|NAME |CHAR(10) |YES | | |
+------+--------------+----+-------+-------+</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>INDEX</code> column (when using type <code>T</code>) contains the following information:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>name</code> of the <code>INDEX</code> (in Trafodion indexes having the same name as the table are Primary Keys).</p>
</li>
<li>
<p><code>ordinal number</code> to identify the order of that field in the index.</p>
</li>
<li>
<p><code>(U)nique o (M)ultiple</code> values allowed.</p>
</li>
<li>
<p><code>(+)</code> means that more than one index includes that field.</p>
</li>
</ul>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_perform_actions_on_multiple_database_objects">4.6. Perform Actions on Multiple Database Objects</h3>
<div class="paragraph">
<p>odb uses extended SQL syntax to execute actions on multiple objects: <code>&amp;&lt;type&gt;:&lt;path&gt;</code> - where <code>&lt;type&gt;</code> is one
of the object types listed in the previous section.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 60%;">
<col style="width: 40%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Example</th>
<th class="tableblock halign-left valign-top">Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>delete from &amp;t:MF%</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Purge ALL tables (t:) staring with <code>M”</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>drop view &amp;v:mftest.%vw</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Drop ALL views (v:) ending with <code>_VW</code> in the schema <code>MFTEST</code>.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UPDATE STATISTICS FOR TABLE &amp;t:TRAFODION.MFTEST.%</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Update Stats for ALL tables in <code>TRAFODION.MFTEST</code>.</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>You can use this <em>extended</em> SQL syntax in the SQL Interpreter or generic SQL scripts.</p>
</div>
</div>
<div class="sect2">
<h3 id="_run_commands_and_scripts">4.7. Run Commands and Scripts</h3>
<div class="paragraph">
<p>The <code>–x</code> switch can be used to run generic SQL commands. You can also use <code>–f</code> to run SQL scripts:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><code>-x "SQL command"</code> to run a specific SQL command.</p>
</li>
<li>
<p><code>-f &lt;script&gt;</code> to run a script file.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -x &quot;select count(*) from customer&quot;
150000
[0.0.0]--- 1 row(s) selected in 0.137s (prep 0.000s, exec 0.137s, 1st fetch 0.000s,
fetch 0.000s)</code></pre>
</div>
</div>
<div class="paragraph">
<p>The meaning of <code>[0.0.0]</code> will be explained later.</p>
</div>
<div style="page-break-after: always;"></div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ cat script.sql
SELECT COUNT(*) FROM T1;
-- This is a comment
SELECT
L_RETURNFLAG
, L_LINESTATUS
, SUM(L_QUANTITY) AS SUM_QTY
, SUM(L_EXTENDEDPRICE) AS SUM_BASE_PRICE
, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS SUM_DISC_PRICE
, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)*(1+L_TAX)) AS SUM_CHARGE
, AVG(L_QUANTITY) AS AVG_QTY
, AVG(L_EXTENDEDPRICE) AS AVG_PRICE
, AVG(L_DISCOUNT) AS AVG_DISC
, COUNT(*) AS COUNT_ORDER
FROM
LINEITEM
WHERE
L_SHIPDATE &lt;= DATE '1998-12-01' - INTERVAL '90' DAY
GROUP BY
L_RETURNFLAG, L_LINESTATUS
ORDER BY
L_RETURNFLAG, L_LINESTATUS
;</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -f script.sql
[0.0.0]Executing: 'SELECT COUNT(*) FROM T1;'
5
[0.0.0]--- 1 row(s) selected in 0.015s (prep 0.000s, exec 0.015s, 1st fetch -0.000s,
fetch -0.000s)
[0.0.1]Executing: 'SELECT L_RETURNFLAG, L_LINESTATUS, SUM(L_QUANTITY) AS SUM_QTY,
SUM(L_EXTENDEDPRICE) AS SUM_BASE_PRICE, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)) AS
SUM_DISC_PRICE, SUM(L_EXTENDEDPRICE*(1- L_DISCOUNT)*(1+L_TAX)) AS SUM_CHARGE,
AVG(L_QUANTITY) AS AVG_QTY, AVG(L_EXTENDEDPRICE) AS AVG_PRICE, AVG(L_DISCOUNT) AS
AVG_DISC, COUNT(*) AS COUNT_ORDER FROM LINEITEM WHERE L_SHIPDATE &lt;= DATE '1998-12-01'
- INTERVAL '90' DAY GROUP BY L_RETURNFLAG, L_LINESTATUS ORDER BY L_RETURNFLAG,
L_LINESTATUS;'
A,F,37734107.00,56586554400.73,53758257134.8700,55909065222.827692,25.522006,
38273.129735,0.049985,1478493
...
R,F,37719753.00,56568041380.90,53741292684.6040,55889619119.831932,25.505794,
38250.854626,0.050009,1478870
[0.0.1]--- 4 row(s) selected in 21.344s (prep 0.000s, exec 21.344s, 1st fetch 0.000s, fetch 0.000s)</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
<div class="paragraph">
<p>You can use the <code>-q</code> switch to omit selected output components.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="paragraph">
<p><code>–q</code> cmd will not print the <strong><em>commands</em></strong> being executed:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -f script.sql –q cmd
5
[0.0.0]--- 1 row(s) selected in 0.015s (prep 0.000s, exec 0.015s, 1st fetch -0.000s,
fetch -0.000s)
A,F,37734107.00,56586554400.73,53758257134.8700,55909065222.827692,25.522006,
38273.129735,0.049985,1478493
...
R,F,37719753.00,56568041380.90,53741292684.6040,55889619119.831932,25.505794,
38250.854626,0.050009,1478870
[0.0.1]--- 4 row(s) selected in 21.344s (prep 0.000s, exec 21.344s, 1st fetch 0.000s,
fetch 0.000s)</code></pre>
</div>
</div>
<div class="paragraph">
<p>While <code>-q</code> res will nit print the <strong><em>results</em></strong>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -f script.sql –q res
[0.0.0]Executing: 'SELECT COUNT(*) FROM T1;'
[0.0.0]--- 1 row(s) selected in 0.015s (prep 0.000s, exec 0.015s, 1st fetch -0.000s,
fetch -0.000s)
[0.0.1]Executing: 'SELECT L_RETURNFLAG,L_LINESTATUS, SUM(L_QUANTITY) AS
SUM_QTY, SUM(L_EXTENDEDPRICE) AS SUM_BASE_PRICE, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT))
AS SUM_DISC_PRICE, SUM(L_EXTENDEDPRICE*(1-L_DISCOUNT)*(1+L_TAX)) AS SUM_CHARGE,
AVG(L_QUANTITY) AS AVG_QTY, AVG(L_EXTENDEDPRICE) AS AVG_PRICE, AVG(L_DISCOUNT) AS
AVG_DISC, COUNT(*) AS COUNT_ORDER FROM LINEITEM WHERE L_SHIPDATE &lt;= DATE '1998-12-01'
- INTERVAL '90' DAY GROUP BY L_RETURNFLAG, L_LINESTATUS ORDER BY L_RETURNFLAG,
L_LINESTATUS;'
[0.0.1]--- 4 row(s) selected in 21.344s (prep 0.000s, exec 21.344s, 1st fetch 0.000s,
fetch 0.000s)</code></pre>
</div>
</div>
<div class="paragraph">
<p><code>-q all</code> (or just <code>-q</code>) will not print neither the <strong><em>commands</em></strong> nor the <strong><em>results</em></strong>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -f script.sql -q all
[0.0.0]--- 1 row(s) selected in 0.015s (prep 0.000s, exec 0.015s, 1st fetch -0.000s,
fetch -0.000s)
[0.0.1]--- 4 row(s) selected in 21.344s (prep 0.000s, exec 21.344s, 1st fetch 0.000s,
fetch 0.000s)</code></pre>
</div>
</div>
<div class="paragraph">
<p>This is often used with odb as query driver.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Even when odb doesn’t print query results (<code>-q res</code>), the result set will be fetched and data is
transferred from the database server to the client. In other words, <code>-q res</code> is somehow similar (but
not exactly equivalent) to a <code>/dev/null</code> output redirection.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>A special file name you can use with <code>-f</code> is <code>-</code> (dash).</p>
</div>
<div class="paragraph">
<p>It means: read the script to be executed from the <em>standard input</em>.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="paragraph">
<p>The following command will <em>copy</em> table definitions from one system to
another recreating, on the target system, the same table structures as in the source system:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">$ odb64luo –u u1 -p p1 -d SRC -i t:TRAFODION.CIV04 -x &quot;SHOWDDL &amp;1&quot; \
| odb64luo –u u2 –p p2 -d TGT -f -</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_shell_script_here_document_syntax">4.8. Shell Script "here document" Syntax</h3>
<div class="paragraph">
<p>Commonly, there&#8217;s a need to <em>embed</em> SQL commands in shell scripts.</p>
</div>
<div class="paragraph">
<p>Use the <code>-f -</code> (read commands from standard input) odb syntax.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">odb64luo -f - &lt;&lt;-EOF 2&gt;&amp;1 | tee -a $\{LOG}
drop table &amp;t:TRAFODION.maurizio.ml%;
create table ml2
(
id integer
, fname char(10)
, bdate date
, lname char(10) default 'Felici'
, comment char(20)
, city char(10)
) no partitions;
EOF</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_parallelize_multiple_commands_and_scripts">4.9. Parallelize Multiple Commands and Scripts</h3>
<div class="paragraph">
<p>odb uses threads to run multiple commands in parallel. Each command (<code>-x</code>) or
script (<code>-f</code>) will be executed, independently from the others, using a different thread.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="paragraph">
<p>Running scripts in parallel.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -x &quot;select count(*) from types&quot; -f script1.sql</code></pre>
</div>
</div>
<div class="paragraph">
<p>Uses two <em>independent</em> threads executed in parallel. The first thread will run <code>select count(*) from types</code> and the other <code>script1.sql</code>.</p>
</div>
<div class="paragraph">
<p>You can also run <strong><em>multiple copies</em></strong> of the same command by adding <code>&lt;num&gt;:</code> before
<code>-x</code> or <code>-f</code> arguments.</p>
</div>
<div class="paragraph">
<p>The following command runs the instances of <code>select count(*) from types `, five instances
of `script1.sql</code> and three instances of <code>script2.sql</code> in parallel using <code>3 + 5 + 3 = 11</code> threads in total:</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="paragraph">
<p>Running eleven commands and scripts in parallel</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -x 3:&quot;select count(*) from types&quot; -f 5:script1.sql \
-f 3:script2.sql -q
[1.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[0.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[2.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[4.0.0]--- 1 row(s) selected in 0.001s (prep 0.000s, exec 0.001s, fetch 0.000s/0.000s)
[6.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[5.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[3.0.0]--- 1 row(s) selected in 0.001s (prep 0.000s, exec 0.001s, fetch 0.000s/0.000s)
[8.0.0]--- 1 row(s) selected in 0.001s (prep 0.000s, exec 0.001s, fetch 0.000s/0.000s)
[7.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[9.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[10.0.0]--- 1 row(s) selected in 0.001s prep 0.000s, exec 0.001s, fetch 0.000s/0.000s)</code></pre>
</div>
</div>
<div class="paragraph">
<p>The first number in <code>[<strong>1</strong>.0.0]</code> is the <strong><em>thread ID</em></strong>. Thread IDs are assigned by odb starting from zero.</p>
</div>
<div class="paragraph">
<p>You can limit the maximum number of threads with <code>-T</code> option.</p>
</div>
<div style="page-break-after: always;"></div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="paragraph">
<p>The following command runs the same 11 commands/scripts limiting the number of threads (<strong>and ODBC connections</strong>) to 4:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -x 3:&quot;select count(*) from types&quot; -f 5:script1.sql \
-f 3:script2.sql -q -T 4
[1.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[0.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[2.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[1.3.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[2.1.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[0.1.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[3.0.0]--- 1 row(s) selected in 0.001s (prep 0.000s, exec 0.001s, fetch 0.000s/0.000s)
[2.2.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[3.1.0]--- 1 row(s) selected in 0.001s (prep 0.000s, exec 0.001s, fetch 0.000s/0.000s)
[0.2.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)
[1.2.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, fetch 0.000s/0.000s)</code></pre>
</div>
</div>
<div class="paragraph">
<p>The thread ID is now in the 0-3 range because the 11 <strong><em>executions</em></strong> were <strong><em>queued</em></strong> into four threads.
odb offers several alternatives to queue <code>M</code> executions in <code>N(&lt;M)</code> threads. See below.</p>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_limit_number_of_odb_threads">4.10. Limit Number of odb Threads</h3>
<div class="paragraph">
<p>By default, odb creates as many threads as the numbers of executions.</p>
</div>
<div class="paragraph">
<p>The command in the following example creates <code>1 + 3 + 3 = 7</code> threads. Each thread will start its own ODBC connection.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/src/C/odb $ ./odb64luo -f script1.sql -f 3:script2.sql -x 3:&quot;&lt;mysqlcmd&gt;&quot;</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can limit the max number of threads using <code>–T</code>.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/src/C/odb $ ./odb64luo -f script1.sql -f 3:script2.sql -x 3:&quot;&lt;mysqlcmd&gt;&quot; -T 2</code></pre>
</div>
</div>
<div class="paragraph">
<p>This command creates just two threads to execute the seven commands/scripts. odb will never create
more threads than needed:</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="exampleblock">
<div class="content">
<div class="paragraph">
<p>~/Devel/odb $ ./odb64luo -f 2:script1.sql -f 3:script2.sql -T 8 -c -q
odb [main(1017)] - Warning: won&#8217;t be created more thread (8) than needed (5).</p>
</div>
</div>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_change_executions_distributed_across_threads">4.11. Change Executions Distributed Across Threads</h3>
<div class="paragraph">
<p>By default, executions are distributed in round-robin across threads.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/src/C/odb $ ./odb64luo -f script1.sql -f 3:script2.sql -x 3:&quot;&lt;mysqlcmd&gt;&quot; -T 3</code></pre>
</div>
</div>
<div class="paragraph">
<p>Using the command above, the execution queue will be as follows:</p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"></th>
<th class="tableblock halign-left valign-top">Thread 1</th>
<th class="tableblock halign-left valign-top">Thread 2</th>
<th class="tableblock halign-left valign-top">Thread3</th>
</tr>
</thead>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock">Third Execution</p></th>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>mysqlcmd</code></p></td>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock">Second Execution</p></th>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Script2.sql</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>mysqlcmd</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>mysqlcmd</code></p></td>
</tr>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock">First Execution</p></th>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Script1.sql</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Script2.sql</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Script2.sql</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>This (standard) behavior can be modified using the following options:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>–Z</code> (shuffle): This option <strong><em>randomizes</em></strong> the execution order.</p>
</li>
<li>
<p><strong><em>factor sign</em></strong> with <code>–P</code> option: See <a href="#query_driver_all_scripts_path">Run All Scripts With a Given Path</a>.</p>
</li>
<li>
<p><code>-dlb</code> (Dynamic Load Balancing): See <a href="#concepts_load_balancing">Dynamic Load Balancing</a>.</p>
</li>
</ul>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="concepts_load_balancing">4.12. Dynamic Load Balancing</h3>
<div class="paragraph">
<p>As discussed in the previous section, executions are normally <em>pre-assigned</em> to threads using a simple
round-robin algorithm. This way, the total elapsed time for each thread depends on the complexity of
<strong>its own</strong> <em>executions</em>.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="paragraph">
<p>Suppose you have two threads and two <em>executions</em> per thread:</p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top"></th>
<th class="tableblock halign-left valign-top">Thread 1</th>
<th class="tableblock halign-left valign-top">Thread 2</th>
</tr>
</thead>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock">Second Execution</p></th>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Script1.2</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Script2.2</code></p></td>
</tr>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock">First Execution</p></th>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Script1.3</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Script2.1</code></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>If thread 2.1 and 2.2 require a very short time to be executed you can have a situation where Thread2 has
nothing to do (it will be terminated) while Thread1 is still busy with <strong>its own</strong> Script1.3 and Script1.2.</p>
</div>
<div class="paragraph">
<p>In some cases, for example during data extractions (see <a href="#load_binary_files">Load Binary Files</a>), you might want to keep all
threads busy at any given time. In these cases you can use Dynamic Load Balancing (<code>-dlb</code>). With Dynamic
Load Balancing jobs are not <strong>pre-assigned</strong> to threads when odb starts; each thread will pick the
next job to run from the job list <em>at run-time</em>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_use_variables_in_odb_scripts">4.13. Use Variables in odb Scripts</h3>
<div class="paragraph">
<p>odb let you to use two kinds of variables:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Internal Variables</strong> defined through the <code>set param</code> command and identified by the ampersand character;</p>
</li>
<li>
<p><strong>Environment variables</strong> defined at operating system level and identified by a dollar sign;</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>You can mix internal and environment variables in your scripts. If a variable is not expanded to a valid
Internal/Environment variable the text will remain unchanged.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ cat scr.sql set param region1 ASIA
-- region1 is defined as an internal odb parameter
select * from tpch.region where r_name = '&amp;region1';
-- region2 is defined as an environment variable
select * from tpch.region where r_name = '$region2';
-- you can mix internal and environment variables
select * from tpch.region where r_name = '$region2' or r_name = '&amp;region1';
-- region3 variable does not exists so it won’t be not expanded
select * from tpch.region where r_name = '&amp;region3';</code></pre>
</div>
</div>
<div class="paragraph">
<p>After you define <code>region2</code> at operating system level:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ export region2=AMERICA</code></pre>
</div>
</div>
<div class="paragraph">
<p>Output:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/Devel/odb $ ./odb64luo -u mauro -p xx -d pglocal -f scr.sql
odb [2011-12-12 08:01:31]: starting (1) ODBC connection(s)... 1 [0.0.0]Executing:
'select * from tpch.region where r_name = 'ASIA';' 2,ASIA,ges. thinly even pinto beans ca
[0.0.0]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, 1st fetch 0.000s, fetch 0.000s)
[0.0.1]Executing: 'select * from tpch.region where r_name = 'AMERICA';' 1,AMERICA,hs use ironic, even requests. s
[0.0.1]--- 1 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, 1st fetch 0.000s, fetch 0.000s)
[0.0.2]Executing: 'select * from tpch.region where r_name = 'AMERICA' or r_name = 'ASIA';' 1,AMERICA,hs use ironic,
even requests.s2,ASIA,ges. thinly even pinto beans ca
[0.0.2]--- 2 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, 1st fetch 0.000s, fetch 0.000s)
[0.0.3]Executing: 'select * from tpch.region where r_name = '&amp;region3';'
[0.0.3]--- 0 row(s) selected in 0.000s (prep 0.000s, exec 0.000s, 1st fetch 0.000s, fetch 0.000s)</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_thread_id_thread_execution_and_script_command">4.14. Thread ID, Thread Execution#, and Script Command#</h3>
<div class="paragraph">
<p>Consider a script containing two commands:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/odb $ cat script.sql
SELECT COUNT(*) FROM ORDERS;
SELECT COUNT(*) FROM SUPPLIER;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Running this script ten times using two threads yields:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">~/odb $ ./odb64luo -f 10:script.sql -q -T 2
[0.0.0]--- 1 row(s) selected in 0.102s (prep 0.022s, exec 0.044s, 1st fetch 0.037s, fetch 0.037s)
[1.0.0]--- 1 row(s) selected in 0.125s (prep 0.022s, exec 0.068s, 1st fetch 0.036s, fetch 0.036s)
[0.0.1]--- 1 row(s) selected in 0.520s (prep 0.022s, exec 0.048s, 1st fetch 0.450s, fetch 0.450s)
[1.0.1]--- 1 row(s) selected in 0.564s (prep 0.017s, exec 0.480s, 1st fetch 0.067s, fetch 0.067s)
[0.1.0]--- 1 row(s) selected in 0.131s (prep 0.022s, exec 0.060s, 1st fetch 0.048s, fetch 0.048s)
[0.1.3]--- 1 row(s) selected in 0.086s (prep 0.022s, exec 0.057s, 1st fetch 0.007s, fetch 0.007s)
[1.3.0]--- 1 row(s) selected in 0.136s (prep 0.035s, exec 0.058s, 1st fetch 0.042s, fetch 0.042s)
[0.2.0]--- 1 row(s) selected in 0.123s (prep 0.029s, exec 0.068s, 1st fetch 0.026s, fetch 0.026s)
[1.3.1]--- 1 row(s) selected in 0.119s (prep 0.016s, exec 0.082s, 1st fetch 0.021s, fetch 0.021s)
[0.2.1]--- 1 row(s) selected in 0.089s (prep 0.031s, exec 0.054s, 1st fetch 0.004s, fetch 0.004s)
[1.2.0]--- 1 row(s) selected in 0.138s (prep 0.023s, exec 0.041s, 1st fetch 0.073s, fetch 0.073s)
[0.3.0]--- 1 row(s) selected in 0.144s (prep 0.038s, exec 0.045s, 1st fetch 0.061s, fetch 0.061s)
[1.2.1]--- 1 row(s) selected in 0.127s (prep 0.016s, exec 0.041s, 1st fetch 0.070s, fetch 0.070s)
[0.3.1]--- 1 row(s) selected in 0.136s (prep 0.033s, exec 0.056s, 1st fetch 0.048s, fetch 0.048s)
[1.3.0]--- 1 row(s) selected in 0.131s (prep 0.023s, exec 0.037s, 1st fetch 0.071s, fetch 0.071s)
[0.4.0]--- 1 row(s) selected in 0.111s (prep 0.033s, exec 0.045s, 1st fetch 0.033s, fetch 0.033s)
[0.4.1]--- 1 row(s) selected in 0.076s (prep 0.033s, exec 0.037s, 1st fetch 0.005s, fetch 0.006s)
[1.3.1]--- 1 row(s) selected in 0.098s (prep 0.016s, exec 0.065s, 1st fetch 0.017s, fetch 0.017s)
[1.4.0]--- 1 row(s) selected in 0.133s (prep 0.023s, exec 0.074s, 1st fetch 0.035s, fetch 0.035s)
[1.4.1]--- 1 row(s) selected in 0.098s (prep 0.017s, exec 0.064s, 1st fetch 0.016s, fetch 0.016s)</code></pre>
</div>
</div>
<div style="page-break-after: always;"></div>
<div class="paragraph">
<p>The numbers between square brackets have the following meaning:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>The first digit is the <strong><em>thread ID</em></strong>. The example above has two threads; the ID is either 0 or 1.</p>
</li>
<li>
<p>The second digit is the <strong><em>execution#</em></strong> for a given thread. The example above has ten script executions
for two threads, each thread will have to execute this script five times.; <strong><em>execution#</em></strong>, is between 0 and 4.</p>
</li>
<li>
<p>The third (last) digit is the <strong><em>command#</em></strong> in a given script. The script in the example above contains two
commands; this value is 0 or 1.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="paragraph">
<p><code><strong>[0.3.1]</strong></code> means that the <strong>first thread</strong> (<em>thread id=0</em>) was executing its <strong>fourth job</strong>
(<em>thread execution#=3</em>) and &#8212; more specifically <mark>&amp;8212; the <strong>second command</strong> in that script
(<em>script command</mark>=1</em>).</p>
</div>
<div style="page-break-after: always;"></div>
</div>
<div class="sect2">
<h3 id="_validate_sql_scripts">4.15. Validate SQL Scripts</h3>
<div class="paragraph">
<p>You can check commands and SQL scripts with odb using the <code>-N</code> (null run) flag. This will just <code>prepare</code>
(compile) the commands without executing them and fetching the results.</p>
</div>
</div>
<div class="sect2">
<h3 id="_different_data_sources_for_different_threads">4.16. Different Data Sources for Different Threads</h3>
<div class="paragraph">
<p>Normally all ODBC connections started by odb will use the same Data Source. However, there could be
special cases where you want to use different DSN for different threads. In these cases you can use the
<code>–ndsn &lt;number&gt;</code> option. This will append to the Data Source name specified via <code>–d</code> a suffix from <code>1</code> to <code>-ndsn</code> argument.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">$ ./odb64luo ... –d MYDSN –ndsn 4</code></pre>
</div>
</div>
<div class="paragraph">
<p>It will use the following (round-robin) DSN/thread association: <code>MYDSN1</code> for the first thread, <code>MYDSN2</code> for the
second thread and so on. The fifth thread (if any) will use <code>MYDSN1</code> again. You can use a sequential
DSN/thread association by using a <code>+</code> sign in front of the <code>–ndsn</code> argument.</p>
</div>
<div class="paragraph">
<p><strong>Example</strong></p>
</div>
<div class="paragraph">
<p>If you have 16 threads and <code>–d MYDSN</code>:</p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Thread ID</th>
<th class="tableblock halign-left valign-top">DSN with <code>–ndsn 8</code></th>
<th class="tableblock halign-left valign-top">DSN with <code>–ndsn +8</code></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>0</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN2</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN1</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>2</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN3</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN2</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>3</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN2</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN5</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN3</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>5</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN6</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN3</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>6</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN7</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN4</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>7</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN8</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN4</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>8</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN1</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN5</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>9</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN2</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN5</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>10</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN3</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN6</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>11</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN4</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN6</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>12</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN5</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN7</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>13</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN6</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>MYDSN7</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>14</code></p></td>
<td class="tableblock halign-left valign-top">&