The project is in a healthy, maintained state
A Ruby gem that wraps the polyglot-sql-ffi native library, mirroring the polyglot-sql Python package: SQL parsing, transpilation across 30+ dialects, pretty-formatting, validation, optimization, lineage, and query analysis.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Runtime

~> 1.15
 Project Readme

polyglot_sql_ffi

Ruby wrapper for polyglot — a SQL parser, transpiler, optimizer, and lineage engine written in Rust. Mirrors the polyglot-sql Python package's module-level API via FFI.

Installation

gem "polyglot_sql_ffi"

The library itself is namespaced PolyglotSql and required as polyglot_sql (both happen automatically under bundler).

Platform gems bundle the native library (linux/macos, x86_64/arm64). Installs that bypass platform gems — JRuby, bundler's force_ruby_platform, a lockfile missing your platform — get the source gem instead, which downloads the same official binary at install time. Platforms polyglot publishes no binary for (e.g. Alpine/musl) must build libpolyglot_sql_ffi themselves and point POLYGLOT_SQL_FFI_PATH at it.

Usage

require "polyglot_sql"

# Transpile between dialects
PolyglotSql.transpile("SELECT IFNULL(a, b) FROM t", read: :mysql, write: :postgres)
# => "SELECT COALESCE(a, b) FROM t"

# Parse to a Hash AST and generate back
ast = PolyglotSql.parse_one("SELECT 1 + 2", dialect: :sqlite)
PolyglotSql.generate(ast, dialect: :sqlite)

# Pretty-format
PolyglotSql.format("SELECT a,b FROM t WHERE x=1", dialect: :sqlite)

# Validate
PolyglotSql.validate("SELECT a FROM t", dialect: :sqlite).valid?

# Canonicalize / optimize
PolyglotSql.optimize("WITH cte AS (SELECT a FROM t) SELECT a FROM cte", dialect: :sqlite)
# => "SELECT a FROM t"

# Lineage
PolyglotSql.lineage("total", sql, dialect: :sqlite)      # by column name
PolyglotSql.lineage_at(0, sql, dialect: :sqlite)         # by output ordinal
PolyglotSql.output_columns(sql, dialect: :sqlite)        # ordered output shape
PolyglotSql.source_tables("total", sql, dialect: :sqlite)

Set a default dialect once instead of passing it everywhere:

PolyglotSql.configure { |c| c.default_dialect = :sqlite }

Errors raise subclasses of PolyglotSql::Error (ParseError, TranspileError, ColumnResolutionError, ...).

Native library

The gem loads libpolyglot_sql_ffi from lib/polyglot_sql/; set POLYGLOT_SQL_FFI_PATH to override with your own build. The bundled version is pinned by PolyglotSql::POLYGLOT_VERSION.

Development

bundle install
rake native:fetch
bundle exec rspec

Releasing

Tag vX.Y.Z and push. The release workflow packages platform gems plus the source gem and publishes to RubyGems via trusted publishing.

License

MIT