<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aniruddh Kawle</title>
    <description>The latest articles on DEV Community by Aniruddh Kawle (@aniruddh_kawle_294f0f38b1).</description>
    <link>https://dev.to/aniruddh_kawle_294f0f38b1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4186691%2F933a52f2-f6fc-44b4-932e-5a9c6f7fa060.png</url>
      <title>DEV Community: Aniruddh Kawle</title>
      <link>https://dev.to/aniruddh_kawle_294f0f38b1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aniruddh_kawle_294f0f38b1"/>
    <language>en</language>
    <item>
      <title>How to format SQL without uploading your queries</title>
      <dc:creator>Aniruddh Kawle</dc:creator>
      <pubDate>Thu, 15 Oct 2026 11:43:34 +0000</pubDate>
      <link>https://dev.to/aniruddh_kawle_294f0f38b1/how-to-format-sql-without-uploading-your-queries-13dg</link>
      <guid>https://dev.to/aniruddh_kawle_294f0f38b1/how-to-format-sql-without-uploading-your-queries-13dg</guid>
      <description>&lt;p&gt;Pasting a production query into a random "SQL formatter" website is a habit most of us have, and a quiet risk. Queries contain table names, column names and sometimes literal values you'd rather not hand to a server you can't inspect. Here's how to check whether a tool really stays local, and what to watch for by dialect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check a tool before you paste
&lt;/h2&gt;

&lt;p&gt;Open your browser's DevTools, go to the &lt;strong&gt;Network&lt;/strong&gt; tab, paste a query and run the formatter. If a request fires that includes your SQL in its payload, the tool sends it to a server. If nothing happens when you format, the work is happening in your tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dialect gotchas
&lt;/h2&gt;

&lt;p&gt;A formatter that parses the wrong dialect will either error out or format a query badly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL:&lt;/strong&gt; &lt;code&gt;::&lt;/code&gt; casts, &lt;code&gt;ILIKE&lt;/code&gt;, &lt;code&gt;RETURNING&lt;/code&gt;, &lt;code&gt;LATERAL&lt;/code&gt; joins, and &lt;code&gt;$$ ... $$&lt;/code&gt; dollar-quoted function bodies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySQL / MariaDB:&lt;/strong&gt; backtick identifiers and &lt;code&gt;LIMIT offset, count&lt;/code&gt;. Note that &lt;code&gt;DELIMITER&lt;/code&gt; is a client command, not SQL, so no formatter can parse it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQL Server (T-SQL):&lt;/strong&gt; &lt;code&gt;[bracketed]&lt;/code&gt; identifiers and &lt;code&gt;TOP&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BigQuery:&lt;/strong&gt; backticked project and dataset paths, and &lt;code&gt;UNNEST&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a valid query fails to format, check the selected dialect before editing the query.&lt;/p&gt;

&lt;h2&gt;
  
  
  A before and after
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2026-01-01'&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'cancelled'&lt;/span&gt; &lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="k"&gt;having&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="k"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;revenue&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;
    &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
    &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2026-01-01'&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'cancelled'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;
    &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;
&lt;span class="k"&gt;HAVING&lt;/span&gt;
    &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;
    &lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only whitespace and keyword case change. Literals and operators are untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a validator can and can't tell you
&lt;/h2&gt;

&lt;p&gt;A parser-based validator catches unbalanced parentheses, unterminated strings and stray operators. It can't know your schema, so a misspelled column still "parses." Read a green result as "this is readable SQL," not "this is correct."&lt;/p&gt;

&lt;h2&gt;
  
  
  A tool I built for this
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://onlinesql.in" rel="noopener noreferrer"&gt;OnlineSQL&lt;/a&gt; because I wanted a formatter that runs in the browser. It formats, beautifies, minifies, validates and diffs SQL, and converts between SQL, JSON and CSV. It has dedicated pages for &lt;a href="https://onlinesql.in/format/postgresql" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;, &lt;a href="https://onlinesql.in/format/mysql" rel="noopener noreferrer"&gt;MySQL&lt;/a&gt; and other dialects. If you find a query it handles badly, I'd like to see it.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>webdev</category>
      <category>database</category>
      <category>tooling</category>
    </item>
    <item>
      <title>---
title: How to format SQL without uploading your queries
published: true
tags: sql, webdev, database, tooling
---

Pasting a production query into a random "SQL formatter" website is a habit most of us have, and a quiet risk. Queries contain table names</title>
      <dc:creator>Aniruddh Kawle</dc:creator>
      <pubDate>Thu, 15 Oct 2026 11:35:18 +0000</pubDate>
      <link>https://dev.to/aniruddh_kawle_294f0f38b1/-title-how-to-format-sql-without-uploading-your-queries-published-true-tags-sql-webdev-dnn</link>
      <guid>https://dev.to/aniruddh_kawle_294f0f38b1/-title-how-to-format-sql-without-uploading-your-queries-published-true-tags-sql-webdev-dnn</guid>
      <description></description>
      <category>privacy</category>
      <category>security</category>
      <category>sql</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
