{"id":368,"date":"2020-04-11T20:03:18","date_gmt":"2020-04-11T20:03:18","guid":{"rendered":"https:\/\/snowflake.pavlik.us\/?p=368"},"modified":"2020-04-14T01:34:35","modified_gmt":"2020-04-14T01:34:35","slug":"overloading-javascript-udfs-in-snowflake","status":"publish","type":"post","link":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/","title":{"rendered":"Overloading JavaScript UDFs in Snowflake"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640.jpg\" alt=\"\" class=\"wp-image-369\" width=\"367\" height=\"377\" srcset=\"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640.jpg 623w, https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640-292x300.jpg 292w\" sizes=\"auto, (max-width: 367px) 100vw, 367px\" \/><figcaption>A Base Function with Two Overloads<\/figcaption><\/figure><\/div>\n\n\n\n<p>Snowflake supports <a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/docs.snowflake.com\/en\/sql-reference\/udf-overview.html#overloading-of-udf-names\" target=\"_blank\">overloading user defined functions<\/a>. It&#8217;s a great way to handle function calls with parameters of different data types or different numbers of parameters. Developers often overload functions to let users send only relevant parameters.<\/p>\n\n\n\n<p>Consider the common <a rel=\"noreferrer noopener\" aria-label=\"SUBSTRING  (opens in a new tab)\" href=\"https:\/\/docs.snowflake.com\/en\/sql-reference\/functions\/substr.html#syntax\" target=\"_blank\">SUBSTRING <\/a>function. You can call it using one of two overloads:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nselect substr(&#039;Hello, world.&#039;, 8);     --This returns &quot;world.&quot;\n\nselect substr(&#039;Hello, world.&#039;, 8, 5);  --This returns &quot;world&quot;\n<\/pre><\/div>\n\n\n<p>In the first statement, the caller sent the string to use and the start position. Omitting the final parameter uses the overload with default behavior, returning to the end of the string.<\/p>\n\n\n\n<p>In the second statement, the caller decided to get rid of the final period. Adding the third parameter for length used the other overload to return five characters instead of the default behavior. <\/p>\n\n\n\n<p>This is a common design with overloaded functions. Mandatory parameters go on the left and optional parameters follow. Each allowable combination of parameters becomes an overload of the function. In this design, developers typically write one base function with all parameters. For the overloads with missing parameters, they&#8217;ll call the base function using a default value for the missing parameter(s).<\/p>\n\n\n\n<p>This design ensures that there&#8217;s only one place to maintain and debug code. The problem is Snowflake JavaScript UDFs cannot call other UDFs. While one way to deal with this is to write the same code in all overloads, it means three places to maintain, improve, and debug code. Fortunately, there&#8217;s a way to write once base function and call it from overloaded functions using defaults.<\/p>\n\n\n\n<p>The solution is to write the base UDF with all parameters in JavaScript. For the overloads that simply call the base function using defaults for missing parameters, call the base JavaScript UDF using an overloaded SQL UDF. This works because SQL UDFs can call other UDFs, which JavaScript UDFs cannot do.<\/p>\n\n\n\n<p>In this example, the JavaScript UDF returns a column displaying a graphical progress bar. The opens are typical for progress bars: percent completion, number of decimal places to display on the percentage, and number of segments to display.<\/p>\n\n\n\n<p>The only one that can&#8217;t be defaulted is the percent complete. It&#8217;s okay to default to two decimal points and ten segments. <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n-- Make a progress bar function that looks like this:   \u2b1b\u2b1b\u2b1c\u2b1c\u2b1c\u2b1c\u2b1c\u2b1c\u2b1c\u2b1c 24.53%\n\n-- This is the main JavaScript function with all parameters.\ncreate or replace function PROGRESS_BAR(PERCENTAGE float, DECIMALS float, SEGMENTS float)\nreturns string\nlanguage javascript\nas\n$$\n\n    var percent = PERCENTAGE;\n    \n    if (isNaN(percent)) percent =   0;\n    if (percent &lt; 0)    percent =   0;\n    if (percent &gt; 100)  percent = 100;\n\n    percent        = percent.toFixed(DECIMALS);\n\n    var filledSegments = Math.round(SEGMENTS * (percent \/ 100));\n    var emptySegments  = SEGMENTS - filledSegments;\n\n    var bar = &#039;\u2b1b&#039;.repeat(filledSegments) + &#039;\u2b1c&#039;.repeat(emptySegments);\n \n    return bar + &quot; &quot; + percent + &quot;%&quot;;\n\n$$;\n\n-- This is an overload with only the percentage, using defaults for \n-- number of segments and decimal points to display on percentage.\ncreate or replace function PROGRESS_BAR(PERCENTAGE float)\nreturns string\nlanguage sql\nas\n$$\n    select progress_bar(PERCENTAGE, 2, 10)\n$$;\n\n-- This is an overload with the percentage and the option set for the\n-- number of decimals to display. It uses a default for number of segments.\ncreate or replace function PROGRESS_BAR(PERCENTAGE float, DECIMALS float)\nreturns string\nlanguage sql\nas\n$$\n    select progress_bar(PERCENTAGE, DECIMALS, 10)\n$$;\n\n-- Call the main JavaScript function by sending all three parameters:\nselect progress_bar(24.5293, 0, 100) as PROGRESS;\n\n-- Call the overloaded SQL function by omitting the number of segments (segments defaults to 10):\nselect progress_bar(24.5293, 1) as PROGRESS;\n\n-- Call the overloaded SQL function specifying only the percentage \n-- (segments defaults to 10 and decimals to 2)\n-- It should display like this:   \u2b1b\u2b1b\u2b1c\u2b1c\u2b1c\u2b1c\u2b1c\u2b1c\u2b1c\u2b1c 24.53%\nselect progress_bar(24.5293) as PROGRESS;\n<\/pre><\/div>\n\n\n<p>By the way, this UDF progress bar is fully functional. If you have a long-running process such as loading a large number of files, you can use it to monitor progress by refreshing the query periodically. Here&#8217;s an example using a long progress bar and 24.41%:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nselect progress_bar(24.41, 2, 100) as PROGRESS;\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"168\" src=\"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/ProgressBar-1024x168.png\" alt=\"\" class=\"wp-image-377\" srcset=\"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/ProgressBar-1024x168.png 1024w, https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/ProgressBar-300x49.png 300w, https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/ProgressBar-768x126.png 768w, https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/ProgressBar.png 1406w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Progress Bar from Overloaded Snowflake UDF<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Snowflake supports overloading user defined functions. It&#8217;s a great way to handle function calls with parameters of different data types or different numbers of parameters. Developers often overload functions to let users send only relevant parameters. Consider the common SUBSTRING function. You can call it using one of two overloads: In the first statement, the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,2,7],"tags":[],"class_list":["post-368","post","type-post","status-publish","format-standard","hentry","category-functions","category-sql","category-udf-sql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\r\n<title>Overloading JavaScript UDFs in Snowflake - Snowflake in the Carolinas<\/title>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/\" \/>\r\n<meta property=\"og:locale\" content=\"en_US\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"Overloading JavaScript UDFs in Snowflake - Snowflake in the Carolinas\" \/>\r\n<meta property=\"og:description\" content=\"Snowflake supports overloading user defined functions. It&#8217;s a great way to handle function calls with parameters of different data types or different numbers of parameters. Developers often overload functions to let users send only relevant parameters. Consider the common SUBSTRING function. You can call it using one of two overloads: In the first statement, the [&hellip;]\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/\" \/>\r\n<meta property=\"og:site_name\" content=\"Snowflake in the Carolinas\" \/>\r\n<meta property=\"article:published_time\" content=\"2020-04-11T20:03:18+00:00\" \/>\r\n<meta property=\"article:modified_time\" content=\"2020-04-14T01:34:35+00:00\" \/>\r\n<meta property=\"og:image\" content=\"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640.jpg\" \/>\r\n\t<meta property=\"og:image:width\" content=\"623\" \/>\r\n\t<meta property=\"og:image:height\" content=\"640\" \/>\r\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\r\n<meta name=\"author\" content=\"Greg Pavlik\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Greg Pavlik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/\"},\"author\":{\"name\":\"Greg Pavlik\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#\\\/schema\\\/person\\\/019455f4675665b6cf5edea31ec44d7b\"},\"headline\":\"Overloading JavaScript UDFs in Snowflake\",\"datePublished\":\"2020-04-11T20:03:18+00:00\",\"dateModified\":\"2020-04-14T01:34:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/\"},\"wordCount\":422,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/snowflake.pavlik.us\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/boxes-2624231_640.jpg\",\"articleSection\":[\"Functions\",\"SnowSQL\",\"UDF\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/\",\"url\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/\",\"name\":\"Overloading JavaScript UDFs in Snowflake - Snowflake in the Carolinas\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/snowflake.pavlik.us\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/boxes-2624231_640.jpg\",\"datePublished\":\"2020-04-11T20:03:18+00:00\",\"dateModified\":\"2020-04-14T01:34:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#\\\/schema\\\/person\\\/019455f4675665b6cf5edea31ec44d7b\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/#primaryimage\",\"url\":\"https:\\\/\\\/snowflake.pavlik.us\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/boxes-2624231_640.jpg\",\"contentUrl\":\"https:\\\/\\\/snowflake.pavlik.us\\\/wp-content\\\/uploads\\\/2020\\\/04\\\/boxes-2624231_640.jpg\",\"width\":623,\"height\":640},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/index.php\\\/2020\\\/04\\\/11\\\/overloading-javascript-udfs-in-snowflake\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/snowflake.pavlik.us\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Overloading JavaScript UDFs in Snowflake\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#website\",\"url\":\"https:\\\/\\\/snowflake.pavlik.us\\\/\",\"name\":\"Snowflake in the Carolinas\",\"description\":\"Random thoughts on all things Snowflake in the Carolinas\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/snowflake.pavlik.us\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/snowflake.pavlik.us\\\/#\\\/schema\\\/person\\\/019455f4675665b6cf5edea31ec44d7b\",\"name\":\"Greg Pavlik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g\",\"caption\":\"Greg Pavlik\"},\"description\":\"Greg is a Senior Sales Engineer at Snowflake Computing, in the Raleigh-Durham area. He's been in data management and security for the twenty years.\"}]}<\/script>\r\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Overloading JavaScript UDFs in Snowflake - Snowflake in the Carolinas","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/","og_locale":"en_US","og_type":"article","og_title":"Overloading JavaScript UDFs in Snowflake - Snowflake in the Carolinas","og_description":"Snowflake supports overloading user defined functions. It&#8217;s a great way to handle function calls with parameters of different data types or different numbers of parameters. Developers often overload functions to let users send only relevant parameters. Consider the common SUBSTRING function. You can call it using one of two overloads: In the first statement, the [&hellip;]","og_url":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/","og_site_name":"Snowflake in the Carolinas","article_published_time":"2020-04-11T20:03:18+00:00","article_modified_time":"2020-04-14T01:34:35+00:00","og_image":[{"width":623,"height":640,"url":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640.jpg","type":"image\/jpeg"}],"author":"Greg Pavlik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Greg Pavlik","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/#article","isPartOf":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/"},"author":{"name":"Greg Pavlik","@id":"https:\/\/snowflake.pavlik.us\/#\/schema\/person\/019455f4675665b6cf5edea31ec44d7b"},"headline":"Overloading JavaScript UDFs in Snowflake","datePublished":"2020-04-11T20:03:18+00:00","dateModified":"2020-04-14T01:34:35+00:00","mainEntityOfPage":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/"},"wordCount":422,"commentCount":0,"image":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/#primaryimage"},"thumbnailUrl":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640.jpg","articleSection":["Functions","SnowSQL","UDF"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/","url":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/","name":"Overloading JavaScript UDFs in Snowflake - Snowflake in the Carolinas","isPartOf":{"@id":"https:\/\/snowflake.pavlik.us\/#website"},"primaryImageOfPage":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/#primaryimage"},"image":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/#primaryimage"},"thumbnailUrl":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640.jpg","datePublished":"2020-04-11T20:03:18+00:00","dateModified":"2020-04-14T01:34:35+00:00","author":{"@id":"https:\/\/snowflake.pavlik.us\/#\/schema\/person\/019455f4675665b6cf5edea31ec44d7b"},"breadcrumb":{"@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/#primaryimage","url":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640.jpg","contentUrl":"https:\/\/snowflake.pavlik.us\/wp-content\/uploads\/2020\/04\/boxes-2624231_640.jpg","width":623,"height":640},{"@type":"BreadcrumbList","@id":"https:\/\/snowflake.pavlik.us\/index.php\/2020\/04\/11\/overloading-javascript-udfs-in-snowflake\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/snowflake.pavlik.us\/"},{"@type":"ListItem","position":2,"name":"Overloading JavaScript UDFs in Snowflake"}]},{"@type":"WebSite","@id":"https:\/\/snowflake.pavlik.us\/#website","url":"https:\/\/snowflake.pavlik.us\/","name":"Snowflake in the Carolinas","description":"Random thoughts on all things Snowflake in the Carolinas","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/snowflake.pavlik.us\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/snowflake.pavlik.us\/#\/schema\/person\/019455f4675665b6cf5edea31ec44d7b","name":"Greg Pavlik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d81df729eebf37a042922b17d4a4c834b1e0ccfa9fea1c2c78cb8e95c7e91701?s=96&d=mm&r=g","caption":"Greg Pavlik"},"description":"Greg is a Senior Sales Engineer at Snowflake Computing, in the Raleigh-Durham area. He's been in data management and security for the twenty years."}]}},"_links":{"self":[{"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/posts\/368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/comments?post=368"}],"version-history":[{"count":11,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/posts\/368\/revisions"}],"predecessor-version":[{"id":381,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/posts\/368\/revisions\/381"}],"wp:attachment":[{"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/media?parent=368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/categories?post=368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/snowflake.pavlik.us\/index.php\/wp-json\/wp\/v2\/tags?post=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}