"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6239],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>y});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=u(r),f=o,y=p["".concat(l,".").concat(f)]||p[f]||d[f]||a;return r?n.createElement(y,i(i({ref:t},s),{},{components:r})):n.createElement(y,i({ref:t},s))}));function y(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c[p]="string"==typeof e?e:o,i[1]=c;for(var u=2;u<a;u++)i[u]=r[u];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},16382:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>y,frontMatter:()=>c,metadata:()=>u,toc:()=>p});var n=r(87462),o=r(63366),a=(r(67294),r(3905)),i=["components"],c={id:"tutorial-jdbc",title:"Use the JDBC driver to query Druid",sidebar_label:"JDBC connector"},l=void 0,u={unversionedId:"tutorials/tutorial-jdbc",id:"tutorials/tutorial-jdbc",title:"Use the JDBC driver to query Druid",description:"\x3c!--",source:"@site/docs/latest/tutorials/tutorial-jdbc.md",sourceDirName:"tutorials",slug:"/tutorials/tutorial-jdbc",permalink:"/docs/latest/tutorials/tutorial-jdbc",draft:!1,tags:[],version:"current",frontMatter:{id:"tutorial-jdbc",title:"Use the JDBC driver to query Druid",sidebar_label:"JDBC connector"},sidebar:"docs",previous:{title:"Query from deep storage",permalink:"/docs/latest/tutorials/tutorial-query-deep-storage"},next:{title:"Architecture",permalink:"/docs/latest/design/architecture"}},s={},p=[],d={toc:p},f="wrapper";function y(e){var t=e.components,r=(0,o.Z)(e,i);return(0,a.kt)(f,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Redirecting you to the JDBC driver API..."),(0,a.kt)("head",null,(0,a.kt)("script",null,'window.location.replace("https://druid.apache.org/docs/latest/api-reference/sql-jdbc.html")')),(0,a.kt)("a",{href:"https://druid.apache.org/docs/latest/api-reference/sql-jdbc.html"},"Click here if you are not redirected."))}y.isMDXComponent=!0}}]);