<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="376101" data-post-id="376101">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Schultzer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Schultzer/120/4339_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Schultzer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>We’ve happy to announce the release of 0.4.0, packed with performance and compile time improvements.</p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/5/7/5747016bb77eb715689e307d533b90d89ce436f3.jpeg" data-download-href="https://forum.elixirforum.com/uploads/default/5747016bb77eb715689e307d533b90d89ce436f3" title="Screenshot 2025-10-18 at 4.32.08 PM" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/5/7/5747016bb77eb715689e307d533b90d89ce436f3_2_690x285.jpeg" alt="Screenshot 2025-10-18 at 4.32.08 PM" data-base62-sha1="cs5FsapgiNDu1wAfUjG4RejwUyD" width="690" height="285" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/5/7/5747016bb77eb715689e307d533b90d89ce436f3_2_690x285.jpeg, https://forum.elixirforum.com/uploads/default/optimized/3X/5/7/5747016bb77eb715689e307d533b90d89ce436f3_2_1035x427.jpeg 1.5x, https://forum.elixirforum.com/uploads/default/original/3X/5/7/5747016bb77eb715689e307d533b90d89ce436f3.jpeg 2x" data-dominant-color="2D3037"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">Screenshot 2025-10-18 at 4.32.08 PM</span><span class="informations">1200×496 32.5 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p>Now as we can lex, parse and generate SQL faster then Ecto can at runtime, then we have moved our attention to implementing a SOTA pool, this will make it possible for us to aim at guaranteeing 100% cache hit on prepared queries, something I have never seen before and will have big impact on general performance.</p>
<p>Please see the <a href="https://github.com/elixir-dbvisor/sql/blob/v0.4.0/CHANGELOG.md" rel="noopener nofollow ugc">sql/CHANGELOG.md at v0.4.0 · elixir-dbvisor/sql · GitHub</a> for all details.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376101" data-batch-url="/posts/batch_likers">
                        8
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/32">Post #31</a>
	                </div>
	            </div>
              <div id="likers-container-376101" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376101"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #31"></div>
  </section>
</div>
    <div class="postbit" id="379621" data-post-id="379621">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Schultzer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Schultzer/120/4339_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Schultzer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>The next version of SQL, is going to be a big leap for our ecosystem, we now have C speed performance with best in class expressiveness. It’s without doubt a SOTA SQL framework across languages, so it’s time for me to ask this community to help with testing it out and shape user experience, and put your name on something truly special out there!</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule SQL.Repo do
  use Ecto.Repo, otp_app: :sql, adapter: Ecto.Adapters.Postgres
  use SQL, adapter: SQL.Adapters.Postgres
  import Ecto.Query
  def sql() do
    SQL.transaction do
      SQL.transaction do
        Enum.to_list(~SQL"SELECT 1")
      end
    end
  end

  def ecto() do
    SQL.Repo.transaction(fn -&gt;
      SQL.Repo.transaction(fn -&gt;
        SQL.Repo.all(select(from("users"), [1]))
      end)
    end)
  end
end
Application.put_env(:sql, :ecto_repos, [SQL.Repo])
Application.put_env(:sql, SQL.Repo, log: false, username: "postgres", password: "postgres", hostname: "localhost", database: "sql_test#{System.get_env("MIX_TEST_PARTITION")}", pool_size: :erlang.system_info(:schedulers_online), ssl: false)
SQL.Repo.__adapter__().storage_up(SQL.Repo.config())
SQL.Repo.start_link()
Benchee.run(
  %{
  "sql" =&gt; fn -&gt; SQL.Repo.sql() end,
  "ecto" =&gt; fn -&gt; SQL.Repo.ecto() end,
  },
  parallel: 1,
  memory_time: 2,
  reduction_time: 2,
  unit_scaling: :smallest,
  measure_function_call_overhead: true)
➜  sql git:(main) ✗ mix sql.bench
Operating System: macOS
CPU Information: Apple M1 Max
Number of Available Cores: 10
Available memory: 64 GB
Elixir 1.20.0-dev
Erlang 28.1
JIT enabled: true

Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
memory time: 2 s
reduction time: 2 s
parallel: 1
inputs: none specified
Estimated total run time: 22 s

Measured function call overhead as: 0 ns
Benchmarking ecto ...
Benchmarking sql ...
Calculating statistics...
Formatting results...

Name           ips        average  deviation         median         99th %
sql       133.60 K        7.48 μs  ±1005.19%        3.75 μs       40.08 μs
ecto        8.69 K      115.09 μs    ±55.74%      111.92 μs      219.96 μs

Comparison:
sql       133.60 K
ecto        8.69 K - 15.38x slower +107.61 μs

Memory usage statistics:

Name         average  deviation         median         99th %
sql         183.99 B     ±0.36%          184 B          184 B
ecto         19192 B     ±0.00%        19192 B        19192 B

Comparison:
sql            184 B
ecto         19192 B - 104.31x memory usage +19008.01 B

Reduction count statistics:

Name         average  deviation         median         99th %
sql         0.0210 K     ±0.00%       0.0210 K       0.0210 K
ecto          1.61 K     ±0.02%         1.61 K         1.61 K

Comparison:
sql         0.0210 K
ecto          1.61 K - 76.62x reduction count +1.59 K
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="379621" data-batch-url="/posts/batch_likers">
                        5
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/33">Post #32</a>
	                </div>
	            </div>
              <div id="likers-container-379621" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="379621"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #32"></div>
  </section>
</div>
    <div class="postbit" id="379683" data-post-id="379683">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Very impressive! Love to see the focus on performance; I’ll have to check out the code as I’ve been on the lookout for Elixir performance tricks lately (for obvious reasons).</p>
<p>I have to say I’m surprised there’s so much of a difference. I would have thought most of the time would be spent in the adapter and on latency for the actual connection (there’s no concurrency here). But, uh, the reduction counts certainly tell a <em>story</em>.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="379683" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/34">Post #33</a>
	                </div>
	            </div>
              <div id="likers-container-379683" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="379683"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #33"></div>
  </section>
</div>
    <div class="postbit" id="379687" data-post-id="379687">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Schultzer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Schultzer/120/4339_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Schultzer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>As we have near zero overhead, then it all comes down to latency and db execution, and thats how you can get close to C level performance, keep you allocation to an absolute minimum and leverage recursive functions, keep your functions private and send messages to processes ideally to the same scheduler, even thought that they can move, chances are they didn’t and it will be cheap.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="379687" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/35">Post #34</a>
	                </div>
	            </div>
              <div id="likers-container-379687" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="379687"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #34"></div>
  </section>
</div>
    <div class="postbit" id="379688" data-post-id="379688">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Is there a way to keep a set of processes pinned to a scheduler, or at least encourage it?</p>
<p>I have been working on a design for a next-gen simulator to replace Hobbes’s Construct (which is pretty slow), and performance is the top priority because I will need to run more strenuous tests (and far more <em>of</em> them) in the near future. The funny thing about the sim is that the processes within a run are not concurrent (this is how I enforce determinism), meaning they will be happiest on the same core.</p>
<p>I don’t really know much about the scheduler but if I had to guess I would say <code>spawn()</code> puts the new process on the same core. Is there more to it?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="379688" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/36">Post #35</a>
	                </div>
	            </div>
              <div id="likers-container-379688" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="379688"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #35"></div>
  </section>
</div>
    <div class="postbit" id="379692" data-post-id="379692">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Schultzer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Schultzer/120/4339_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Schultzer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>You can not control which scheduler a process is on, the VM will move them how it see fit, but by designing your application based on the schedulers then it should at least help you statistically, although I still need to verify this, which shouldn’t be to hard with my current design.</p>
<p>Hadn’t really looked into if the way I currently do it is good or not, short answer is you want to hash the pid to get stable affinity, and you can get around 40-75% under realistic load.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="379692" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/37">Post #36</a>
	                </div>
	            </div>
              <div id="likers-container-379692" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="379692"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #36"></div>
  </section>
</div>
    <div class="postbit" id="379694" data-post-id="379694">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Schultzer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Schultzer/120/4339_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Schultzer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I just tested out using hash and I got even better results then before:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">➜  sql git:(main) ✗ mix sql.bench
Compiling 2 files (.ex)
Generated sql app
Operating System: macOS
CPU Information: Apple M1 Max
Number of Available Cores: 10
Available memory: 64 GB
Elixir 1.20.0-dev
Erlang 28.1
JIT enabled: true

Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
memory time: 2 s
reduction time: 2 s
parallel: 1
inputs: none specified
Estimated total run time: 22 s

Measured function call overhead as: 0 ns
Benchmarking ecto ...
Benchmarking sql ...
Calculating statistics...
Formatting results...

Name           ips        average  deviation         median         99th %
sql       162.06 K        6.17 μs  ±1992.10%        2.92 μs       34.63 μs
ecto        7.84 K      127.51 μs    ±23.57%      117.29 μs      222.81 μs

Comparison:
sql       162.06 K
ecto        7.84 K - 20.66x slower +121.33 μs

Memory usage statistics:

Name         average  deviation         median         99th %
sql         183.95 B     ±0.81%          184 B          184 B
ecto         19184 B     ±0.00%        19184 B        19184 B

Comparison:
sql            184 B
ecto         19184 B - 104.29x memory usage +19000.05 B

Reduction count statistics:

Name         average  deviation         median         99th %
sql         0.0210 K     ±0.13%       0.0210 K       0.0210 K
ecto          1.61 K     ±0.01%         1.61 K         1.61 K

Comparison:
sql         0.0210 K
ecto          1.61 K - 76.62x reduction count +1.59 K

Profiling sql with fprof...
Reading trace data...

End of trace!
Processing data...
Creating output...
Done!

                                                                   CNT    ACC (ms)    OWN (ms)
Total                                                               15       0.094       0.031
:fprof.apply_start_stop/4                                            0       0.094       0.005
anonymous fn/0 in :elixir_compiler_2.__FILE__/1                      1       0.089       0.001
SQL.Repo.sql/0                                                       1       0.088       0.012
:suspend                                                             2       0.063       0.000
Process.put/2                                                        1       0.003       0.002
Process.delete/1                                                     1       0.003       0.002
:erlang.send/2                                                       2       0.002       0.002
Process.get/1                                                        1       0.002       0.001
:persistent_term.get/1                                               1       0.001       0.001
:erlang.put/2                                                        1       0.001       0.001
:erlang.phash2/2                                                     1       0.001       0.001
:erlang.make_ref/0                                                   1       0.001       0.001
:erlang.erase/1                                                      1       0.001       0.001
Process.get/2                                                        1       0.001       0.001
:undefined                                                           0       0.000       0.000

Profiling ecto with fprof...
Reading trace data...
.
End of trace!
Processing data...
Creating output...
Done!

                                                                   CNT    ACC (ms)    OWN (ms)
Total                                                              768       1.622       1.311
:fprof.apply_start_stop/4                                            0       1.622       0.005
anonymous fn/0 in :elixir_compiler_2.__FILE__/1                      1       1.617       0.001
SQL.Repo.ecto/0                                                      1       1.616       0.001
SQL.Repo.transaction/1                                               2       1.615       0.002
SQL.Repo.transaction/2                                               2       1.614       0.008
Ecto.Repo.Transaction.transaction/4                                  2       1.587       0.002
Ecto.Adapters.Postgres.transaction/3                                 2       1.586       0.002
Ecto.Adapters.SQL.transaction/3                                      2       1.585       0.002
Ecto.Adapters.SQL.checkout_or_transaction/4                          2       1.584       0.008
DBConnection.transaction/3                                           2       1.575       0.005
DBConnection.run_transaction/4                                       1       0.961       0.005
DBConnection.Holder.handle/4                                         3       0.722       0.003
DBConnection.Holder.handle_or_cleanup/5                              3       0.719       0.009
anonymous fn/3 in Ecto.Adapters.SQL.checkout_or_transaction/         2       0.714       0.008
DBConnection.Holder.holder_apply/4                                   3       0.704       0.009
anonymous fn/0 in SQL.Repo.ecto/0                                    1       0.698       0.001
anonymous fn/0 in SQL.Repo.ecto/0                                    1       0.633       0.001
SQL.Repo.all/1                                                       1       0.632       0.001
SQL.Repo.all/2                                                       1       0.631       0.004
DBConnection.begin/3                                                 1       0.612       0.003
Ecto.Repo.Queryable.all/3                                            1       0.605       0.004
Ecto.Repo.Queryable.execute/4                                        1       0.594       0.009
DBConnection.checkout/4                                              1       0.518       0.003
Postgrex.Protocol.handle_transaction/3                               2       0.501       0.006
DBConnection.run_begin/3                                             1       0.425       0.003
Postgrex.Protocol.handle_begin/2                                     1       0.408       0.002
Postgrex.Protocol.msg_recv/3                                        10       0.397       0.020
Postgrex.Protocol.recv_transaction/3                                 2       0.375       0.002
Postgrex.Protocol.recv_transaction/4                                 4       0.373       0.012
Postgrex.Protocol.msg_recv/4                                         3       0.362       0.006
Ecto.Adapters.Postgres.execute/5                                     1       0.345       0.003
Ecto.Adapters.SQL.execute/6                                          1       0.338       0.003
Ecto.Adapters.SQL.execute!/5                                         1       0.334       0.002
Ecto.Adapters.SQL.sql_call/5                                         1       0.332       0.005
:gen_tcp.recv/3                                                      3       0.323       0.006
Ecto.Adapters.Postgres.Connection.execute/4                          1       0.321       0.003
Postgrex.execute/4                                                   1       0.317       0.001
DBConnection.execute/4                                               1       0.316       0.005
:suspend                                                             8       0.311       0.000
:inet_tcp.recv/3                                                     3       0.308       0.003
:prim_inet.recv/3                                                    3       0.305       0.003
:prim_inet.recv0/3                                                   3       0.302       0.009
DBConnection.log/4                                                   3       0.245       0.003
DBConnection.log/5                                                   3       0.242       0.012
DBConnection.commit/3                                                1       0.232       0.003
Enum.reduce/3                                                       12       0.224       0.012
Enum."-reduce/3-lists^foldl/2-0-"/3                                 37       0.217       0.062
Ecto.Query.Planner.query/5                                           1       0.207       0.003
Ecto.Query.Planner.plan/3                                            1       0.196       0.001
Ecto.Query.Planner.plan/4                                            1       0.195       0.013
DBConnection.run/6                                                   1       0.191       0.001
DBConnection.run_execute/5                                           1       0.190       0.003
DBConnection.log/2                                                   3       0.185       0.003
anonymous fn/4 in Ecto.Adapters.SQL.with_log/3                       3       0.182       0.003
Postgrex.Protocol.msg_send/3                                         3       0.179       0.006
Ecto.Adapters.SQL.log/4                                              3       0.179       0.033
Postgrex.Protocol.handle_execute/4                                   1       0.174       0.002
Postgrex.Protocol.handle_execute_result/4                            1       0.169       0.004
Postgrex.Protocol.rebind_execute/4                                   1       0.150       0.001
Postgrex.Protocol.bind_execute/4                                     1       0.149       0.005
Ecto.Query.Planner.plan_cache/3                                      1       0.148       0.003
Ecto.Query.Planner.traverse_cache/4                                  1       0.144       0.003
DBConnection.checkin/4                                               1       0.144       0.003
Ecto.Query.Planner.traverse_exprs/4                                  1       0.130       0.001
DBConnection.run_commit/3                                            1       0.128       0.004
Postgrex.Protocol.handle_commit/2                                    1       0.110       0.003
Postgrex.Protocol.do_send/3                                          3       0.102       0.006
anonymous fn/3 in Ecto.Query.Planner.traverse_exprs/4               13       0.101       0.026
:gen_tcp.send/2                                                      3       0.096       0.006
DBConnection.checkout/3                                              1       0.090       0.009
:inet_tcp.send/2                                                     3       0.081       0.003
:prim_inet.send/3                                                    3       0.078       0.009
Keyword.get/3                                                       25       0.075       0.050
anonymous fn/6 in Ecto.Query.Planner.traverse_cache/4               13       0.075       0.026
Access.get/2                                                        17       0.068       0.017
DBConnection.ConnectionPool.checkout/3                               1       0.066       0.001
DBConnection.Holder.checkout/3                                       1       0.065       0.005
:prim_inet.send/4                                                    3       0.063       0.010
Ecto.Repo.Supervisor.tuplet/2                                        3       0.057       0.012
anonymous fn/2 in Postgrex.Protocol.msg_send/3                       5       0.055       0.010
Access.get/3                                                        17       0.051       0.034
:erlang.port_command/3                                               3       0.050       0.006
Ecto.Query.Planner.merge_cache/6                                    13       0.049       0.025
Postgrex.Protocol.msg_decode/1                                      10       0.048       0.018
Postgrex.Protocol.maybe_encode_msg/1                                 5       0.045       0.005
:erts_internal.port_command/3                                        3       0.044       0.016
Keyword.get/2                                                       11       0.044       0.011
:lists.keyfind/3                                                    43       0.043       0.043
Postgrex.Messages.encode_msg/1                                       5       0.040       0.015
DBConnection.LogEntry.new/5                                          3       0.039       0.003
DBConnection.Holder.checkout/5                                       1       0.039       0.002
DBConnection.LogEntry.parse_times/2                                  3       0.036       0.009
DBConnection.Holder.checkout_call/5                                  1       0.036       0.007
Postgrex.Protocol.recv_execute/4                                     1       0.034       0.001
Postgrex.Protocol.recv_execute/5                                     1       0.033       0.003
Postgrex.Protocol.recv_bind/3                                        1       0.032       0.002
Postgrex.Messages.parse/3                                            7       0.030       0.010
:prim_inet.async_recv/3                                              3       0.027       0.009
Ecto.Repo.Registry.lookup/1                                          6       0.027       0.012
String.Chars.to_string/1                                             3       0.026       0.006
Enum.map/2                                                           3       0.025       0.003
Postgrex.Protocol.rows_recv/4                                        1       0.022       0.002
Enum."-map/2-lists^map/1-1-"/2                                       5       0.022       0.009
:telemetry.execute/3                                                 3       0.021       0.006
Ecto.Adapters.SQL.log_measurements/3                                12       0.021       0.012
Postgrex.Messages.encode/1                                           5       0.020       0.009
Postgrex.Messages.decode_string/1                                    3       0.020       0.009
DBConnection.decode/4                                                1       0.020       0.003
Enum.map_reduce/3                                                    7       0.019       0.007
:inet_db.lookup_socket/1                                             6       0.018       0.012
Postgrex.Protocol.notify/1                                           3       0.018       0.006
Ecto.Adapters.SQL.put_conn/2                                         3       0.018       0.006
DBConnection.meter/1                                                 3       0.018       0.006
Ecto.Repo.Preloader.query/7                                          1       0.017       0.001
:prim_inet.ctl_cmd/3                                                 3       0.015       0.006
Ecto.Query.Planner.plan_sources/3                                    1       0.015       0.007
DBConnection.Query.decode/3                                          1       0.014       0.002
Postgrex.Protocol.rows_msg/3                                         1       0.013       0.002
GenServer.whereis/1                                                  4       0.013       0.004
Ecto.Adapters.SQL.reset_conn/2                                       2       0.013       0.003
DBConnection.maybe_encode/4                                          1       0.013       0.002
DBConnection.checkin/1                                               1       0.013       0.001
Enum."-map_reduce/3-lists^mapfoldl/2-0-"/3                           8       0.012       0.010
DBConnection.Holder.checkin/1                                        1       0.012       0.002
DBConnection.event/2                                                 4       0.012       0.008
anonymous fn/3 in Ecto.Repo.Queryable.postprocessor/4                1       0.011       0.002
Ecto.Query.Planner.finalize_cache/3                                  1       0.011       0.006
DBConnection.Query.encode/3                                          1       0.011       0.002
DBConnection.Holder.abs_timeout/2                                    1       0.010       0.003
DBConnection.conclude/2                                              2       0.010       0.004
:telemetry_handler_table.list_for_event/1                            3       0.009       0.006
:erlang.port_control/3                                               3       0.009       0.006
:erlang.monotonic_time/0                                             9       0.009       0.009
String.Chars.impl_for!/1                                             3       0.009       0.006
Process.whereis/1                                                    3       0.009       0.006
Process.put/2                                                        3       0.009       0.006
Map.new/1                                                            3       0.009       0.006
Ecto.Repo.Queryable.process/4                                        2       0.009       0.002
Ecto.Adapters.SQL.get_conn_or_pool/2                                 3       0.009       0.006
DBConnection.Query.Postgrex.Query.decode/3                           1       0.009       0.002
DBConnection.Holder.status?/2                                        3       0.009       0.006
DBConnection.Holder.done/4                                           1       0.009       0.004
:ets.lookup/2                                                        8       0.008       0.008
:erlang.++/2                                                         8       0.008       0.008
:binary.match/2                                                      3       0.008       0.008
System.monotonic_time/1                                              1       0.008       0.006
String.Chars.Atom.to_string/1                                        2       0.008       0.002
Process.get/2                                                        4       0.008       0.008
Postgrex.Protocol.done/4                                             1       0.008       0.002
Postgrex.Protocol.done/2                                             2       0.008       0.004
Enum.reverse/1                                                       8       0.008       0.008
Ecto.Repo.Queryable.process_args/4                                   1       0.008       0.001
Ecto.Repo.Assoc.query/4                                              1       0.008       0.001
Ecto.Query.Planner.plan_expr_subqueries/3                            4       0.008       0.004
:ets.update_element/3                                                5       0.007       0.007
:ets.lookup_element/3                                                7       0.007       0.007
Postgrex.Types.decode_rows/4                                         1       0.007       0.001
Postgrex.Protocol.recv_ready/3                                       1       0.007       0.002
Postgrex.Protocol.decode_tag/1                                       3       0.007       0.004
Ecto.Query.Planner.query_with_cache/8                                1       0.007       0.003
Ecto.Adapters.SQL.key/1                                              7       0.007       0.007
DBConnection.Query.Postgrex.Query.decode_map/2                       1       0.007       0.002
:lists.foreach/2                                                     3       0.006       0.003
:erlang.port_get_data/1                                              6       0.006       0.006
:erlang.atom_to_binary/1                                             2       0.006       0.004
SQL.Repo.prepare_opts/2                                              3       0.006       0.003
Postgrex.Protocol.mode/1                                             1       0.006       0.002
Postgrex.Protocol.build_commit_statement/2                           1       0.006       0.002
Postgrex.DefaultTypes.decode_rows/3                                  1       0.006       0.001
Map.get/2                                                            3       0.006       0.003
Ecto.Queryable.to_query/1                                            1       0.006       0.002
Ecto.Query.Planner.cast_and_merge_params/5                           2       0.006       0.002
DBConnection.Query.Postgrex.Query.encode/3                           1       0.006       0.002
DBConnection.Query.impl_for!/1                                       2       0.006       0.004
DBConnection.LogEntry.parse_time/2                                   6       0.006       0.006
:erlang.iolist_size/1                                                5       0.005       0.005
Process.get/1                                                        1       0.005       0.001
Postgrex.DefaultTypes.decode_rows/4                                  2       0.005       0.002
Ecto.Query.Planner.attach_prefix/2                                   1       0.005       0.002
DBConnection.reset/1                                                 1       0.005       0.002
:erlang.monitor/2                                                    4       0.004       0.004
:erlang.demonitor/2                                                  4       0.004       0.004
Postgrex.Types.encode_params/3                                       1       0.004       0.001
Postgrex.Protocol.decode_tags/1                                      2       0.004       0.002
Postgrex.DefaultTypes."Elixir.Postgrex.Extensions.Bool"/7            1       0.004       0.002
Ecto.Query.Planner.prepend_if/3                                      4       0.004       0.004
Ecto.Query.Planner.plan_expr_subqueries/5                            4       0.004       0.004
Ecto.Query.Planner.plan_combinations/3                               1       0.004       0.002
:prim_inet.enc_time/1                                                3       0.003       0.003
:maps.from_list/1                                                    3       0.003       0.003
:lists.foreach_1/2                                                   3       0.003       0.003
:erts_internal.port_control/3                                        3       0.003       0.003
:erlang.whereis/1                                                    3       0.003       0.003
:erlang.term_to_binary/2                                             3       0.003       0.003
:erlang.split_binary/2                                               3       0.003       0.003
:erlang.put/2                                                        3       0.003       0.003
:erlang.binary_to_integer/1                                          1       0.003       0.002
String.Chars.Postgrex.Query.to_string/1                              1       0.003       0.002
String.Chars.impl_for/1                                              3       0.003       0.003
SQL.Repo.default_options/1                                           3       0.003       0.003
Process.delete/1                                                     1       0.003       0.002
Postgrex.Protocol.query_member?/2                                    1       0.003       0.002
anonymous fn/2 in Postgrex.Messages.encode/1                         1       0.003       0.002
Postgrex.DefaultTypes.encode_params/2                                1       0.003       0.001
Map.get/3                                                            3       0.003       0.003
Keyword.fetch/2                                                      1       0.003       0.002
Ecto.Queryable.impl_for!/1                                           1       0.003       0.002
Ecto.Query.Planner.query_lookup/6                                    1       0.003       0.002
Ecto.Query.Planner.plan_assocs/1                                     1       0.003       0.002
Ecto.Adapters.SQL.with_log/3                                         3       0.003       0.003
DBConnection.Holder.start_deadline/5                                 1       0.003       0.002
DBConnection.Holder.checkout_result/3                                1       0.003       0.002
DBConnection.Holder.cancel_deadline/1                                1       0.003       0.002
DBConnection.log_result/1                                            3       0.003       0.003
DBConnection.entry_result/1                                          3       0.003       0.003
:erlang.list_to_bitstring/1                                          2       0.002       0.002
:erlang.atom_to_binary/2                                             2       0.002       0.002
Postgrex.DefaultTypes.encode_params/3                                1       0.002       0.001
anonymous fn/4 in Ecto.Repo.Queryable.process_args/4                 1       0.002       0.001
anonymous fn/3 in Ecto.Repo.Queryable.preprocessor/3                 1       0.002       0.001
Ecto.Query.Planner.plan_joins/5                                      1       0.002       0.001
Ecto.Query.Planner.plan_from/3                                       1       0.002       0.001
Ecto.Query.Planner.plan_expr_subquery/3                              2       0.002       0.002
Ecto.Query.Planner.merge_cache/3                                     2       0.002       0.002
DBConnection.Query.impl_for/1                                        2       0.002       0.002
DBConnection.past_event/3                                            2       0.002       0.002
DBConnection.handle_common_result/3                                  2       0.002       0.002
:maps.remove/2                                                       1       0.001       0.001
:ets.give_away/3                                                     1       0.001       0.001
:erts_internal.binary_to_integer/2                                   1       0.001       0.001
:erlang.start_timer/4                                                1       0.001       0.001
:erlang.send/2                                                       1       0.001       0.001
:erlang.monotonic_time/1                                             1       0.001       0.001
:erlang.make_ref/0                                                   1       0.001       0.001
:erlang.list_to_tuple/1                                              1       0.001       0.001
:erlang.iolist_to_binary/1                                           1       0.001       0.001
:erlang.erase/1                                                      1       0.001       0.001
:erlang.cancel_timer/2                                               1       0.001       0.001
System.normalize_time_unit/1                                         1       0.001       0.001
SQL.Repo.prepare_query/3                                             1       0.001       0.001
Postgrex.Protocol.done/5                                             1       0.001       0.001
Postgrex.Messages.format/1                                           1       0.001       0.001
Enum.unzip/1                                                         1       0.001       0.001
Ecto.Repo.Queryable.preprocessor/3                                   1       0.001       0.001
Ecto.Repo.Queryable.preprocess/4                                     1       0.001       0.001
Ecto.Repo.Queryable.postprocessor/4                                  1       0.001       0.001
Ecto.Queryable.Ecto.Query.to_query/1                                 1       0.001       0.001
Ecto.Queryable.impl_for/1                                            1       0.001       0.001
Ecto.Query.Planner.source_cache/2                                    1       0.001       0.001
Ecto.Query.Planner.plan_windows/2                                    1       0.001       0.001
Ecto.Query.Planner.plan_source/4                                     1       0.001       0.001
Ecto.Query.Planner.plan_joins/9                                      1       0.001       0.001
Ecto.Query.Planner.plan_ctes/3                                       1       0.001       0.001
Ecto.Query.Planner.plan_assocs/3                                     1       0.001       0.001
Ecto.Query.Planner.expr_to_cache/1                                   1       0.001       0.001
Ecto.Query.Planner.ensure_select/2                                   1       0.001       0.001
Ecto.Query.Planner.build_meta/2                                      1       0.001       0.001
Ecto.Adapters.SQL.put_source/2                                       1       0.001       0.001
Ecto.Adapters.Postgres.Connection.ensure_list_params!/1              1       0.001       0.001
Ecto.Adapters.Postgres.valid_prepare?/1                              1       0.001       0.001
:undefined                                                           0       0.000       0.000
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="379694" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/38">Post #37</a>
	                </div>
	            </div>
              <div id="likers-container-379694" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="379694"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #37"></div>
  </section>
</div>
    <div class="postbit" id="380502" data-post-id="380502">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aseigo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aseigo/120/10674_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aseigo
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>A bit late to this party, but …</p>
<h3><a name="p-380502-on-the-name-of-the-library-1" class="anchor" href="#p-380502-on-the-name-of-the-library-1" aria-label="Heading link" rel="nofollow"></a>On the name of the library</h3>
<p>Calling the library <code>SQL</code> seems a dubious choice, to put it kindly.</p>
<p>SQL is a standard (more or less <img src="https://forum.elixirforum.com/images/emoji/apple/wink.png?v=15" title=":wink:" class="emoji" alt=":wink:" loading="lazy" width="20" height="20"> ) and there are various libraries out there that provide various types of SQL features. Now there’s a library name-squatting on that technology by its name on hex.pm.</p>
<p>There are a sad number of libraries on hex.pm that already name-squat on the broadest possible names, too many of which are some combination of incomplete, abandoned, or not the best option anymore. Searching for those broad names still brings them up, making it often much harder than it should be to find the actually relevant choices on hex.pm.</p>
<p>It would be great to not replicate that with yet another library calling itself the name of the thing it provides.</p>
<p>Imagine if Ecto had been called SQL. What then for your library?</p>
<h2><a name="p-380502-extensibility-2" class="anchor" href="#p-380502-extensibility-2" aria-label="Heading link" rel="nofollow"></a>Extensibility</h2>
<p>How does one add data types?</p>
<p>I work with a number of custom datatypes and have various means of working with Ecto on utilizing them across various backends. Libraries like <code>geo_sql</code> rely on this to work with WKT/WKB types as stored and returned by various database GIS implementations.</p>
<p>How would one add support for another DB, such as SQLite?</p>
<p>Will it eventually be possible to use existing and more complete librareis such as <code>postgrex</code> for backend access, or is the plan for <code>SQL</code> to always ship its own hand-rolled implementations?</p>
<p>(See how the name of the library makes it harder to have these sorts of conversations? When I write “for SQL to always” do I mean the library, the language, a given query, …)</p>
<h3><a name="p-380502-interop-3" class="anchor" href="#p-380502-interop-3" aria-label="Heading link" rel="nofollow"></a>Interop</h3>
<p>Are there any thoughts/plans on interop with Ecto, or will these be two separate walled gardens going forward?</p>
<h3><a name="p-380502-composition-4" class="anchor" href="#p-380502-composition-4" aria-label="Heading link" rel="nofollow"></a>Composition</h3>
<p>If one writes something like: <code>~SQL[from users where foo = 2 select id, email] |&gt; ~SQL[where bar = 2]</code>it ends up with 2 where clauses, and this causes an error. Same for any other clause for that matter. Will this library eventually support actual composibility of queries? This is a feature provided by Ecto which is absolutely invaluable.</p>
<p>The composability also seems somewhat fragile? e.g.:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">     sql = ~SQL[from users u]
      |&gt; ~SQL{where u.email = 'john@example.com'}
      |&gt; ~SQL{where u.email = 'john@example.com'}
      |&gt; ~SQL{foosball}
      |&gt; ~SQL[select id, email, inserted_at, updated_at]
</code></pre>
<p>Produces: <code>“foosball where u.email = ‘john@example.com’ where u.email = ‘john@example.com’ from users u select id, email, inserted_at, updated_at”</code> Note how the select statement is suddenly at the end.</p>
<p>Moving the select above the <code>foosball</code> bit puts the select in its correct position.</p>
<p>Is this resolvable in the library, or is the expectation that the user of the library always places things in a sensible order?</p>
<p>I appreciate that there is a focus on performance in this library, but if things don’t work it makes it hard to consider as an option.</p>
<p>p.s. The LetsEncrypt-issued SSL cert on dbvisor expired in September. <img src="https://forum.elixirforum.com/images/emoji/apple/confused.png?v=15" title=":confused:" class="emoji" alt=":confused:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380502" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/39">Post #38</a>
	                </div>
	            </div>
              <div id="likers-container-380502" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380502"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #38"></div>
  </section>
</div>
    <div class="postbit" id="380504" data-post-id="380504">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Schultzer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Schultzer/120/4339_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Schultzer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks for this thoughtful review, with regards to naming, there is with no doubt chutzpah behind it, but we’re talking about a library that is a foreign language integration.</p>
<p>We’re still at the very early stage where focus is on the foundation, so your points are well taken but at this time they are table stakes compared to the ongoing work that is actually making a bigger impact. It would even be trivial for the community to contribute to what you outlined.</p>
<p>I’ve talked privately about creating an sql_ecto to provide sql adapters to Ecto, should be possible to help Ecto scale a bit better.</p>
<p>I’m currently getting ready to tie up the Postgres adapter which would include support for custom types, canceling long running queries, improve error reporting and telemetric. I would appreciate any feedback you have to how you envision the UX should be for custom types and anything else that you care about.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380504" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/40">Post #39</a>
	                </div>
	            </div>
              <div id="likers-container-380504" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380504"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #39"></div>
  </section>
</div>
    <div class="postbit" id="380510" data-post-id="380510">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="aseigo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/aseigo/120/10674_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  aseigo
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Schultzer" data-post="40" data-topic="69807">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/schultzer/48/4339_2.png" class="avatar"> Schultzer:</div>
<blockquote>
<p>there is with no doubt chutzpah behind it,</p>
</blockquote>
</aside>
<p>Chutzpah is fine, but what I care about is what is good for the Elixir ecosystem.</p>
<aside class="quote no-group" data-username="Schultzer" data-post="40" data-topic="69807">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/schultzer/48/4339_2.png" class="avatar"> Schultzer:</div>
<blockquote>
<p>but we’re talking about a library that is a foreign language integration.</p>
</blockquote>
</aside>
<p>By that thinking <code>rustler</code> should be called <code>rust</code>, <code>bandit</code> should be <code>http</code>, and <code>ecto</code> should be <code>sql</code>, and so on. Even libraries that provide access to a specific <em>API</em> tend not to call themselves that.</p>
<p>Of course, there are libraries that do this (sort, openstreetmap, ..). It ages poorly for the decent libraries, and is simply unhelpful for libraries that don’t end up working out. I don’t know where the <code>sql</code> library will end up, but calling it <code>sql</code> is poor form imho.</p>
<p>As an extensive user of Elixir libraries and someone who has introduced Elixir into new places more than once, this sort of thing is not just aggravating, it tarnishes how Elixir looks during technical due-diligence.</p>
<aside class="quote no-group" data-username="Schultzer" data-post="40" data-topic="69807">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/schultzer/48/4339_2.png" class="avatar"> Schultzer:</div>
<blockquote>
<p>would appreciate any feedback you have</p>
</blockquote>
</aside>
<p>I actually offered some feedback above, and most of the questions I asked are still there. <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
<p>I’ll hold off on going deeper into things like D/X for custom types until I understand those points a bit better. Cheers.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380510" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/sql-brings-an-extensible-sql-parser-and-sigil-to-elixir-confidently-write-sql-with-automatic-parameterized-queries/69807/41">Post #40</a>
	                </div>
	            </div>
              <div id="likers-container-380510" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380510"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #40"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/69807/load_more?page=5">Load more posts (32 remaining)</a>
</div></template></turbo-stream>