load_sql_proc 0.1.5

A procedural macro for load & minifying SQL queries at compile time.
Documentation
# SQL minifier
[![Build status](https://github.com/mvisani/SQL-minifier/actions/workflows/build.yml/badge.svg)](https://github.com/mvisani/SQL-minifier/actions)
[![Crates.io](https://img.shields.io/crates/v/SQL-minifier.svg)](https://crates.io/crates/SQL-minifier)
[![Documentation](https://docs.rs/sql_minifier/badge.svg)](https://docs.rs/sql_minifier)
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)

[SQL minifier](https://github.com/mvisani/SQL-minifier) provides methods and procedural macros to minify SQL code, optionally at compile time.
It removes both single-line `--` and multi-line `/* ... */` comments, unnecessary whitespaces, and shortens SQL keywords such as `INTEGER` to `INT`.

## Installation
Add the following to your `Cargo.toml` file:
```toml
[dependencies]
sql_minifier = "0.1.4"
```

or use the following command:
```bash
cargo add sql_minifier
```

## Examples
Suppose you have an SQL string and you want to minify it. You can use the [`minify_sql`](https://github.com/mvisani/SQL-minifier/blob/b22627d27905ea5ce92d3a683ac10d11bccbfae9/minify_sql/src/lib.rs#L35) function:

```rust
use sql_minifier::minify_sql;

let minified: String = minify_sql(
    "-- Your SQL goes here
CREATE TABLE IF NOT EXISTS taxa (
    -- The unique identifier for the taxon
    id UUID PRIMARY KEY,
    -- The scientific name of the taxon
    name TEXT NOT NULL,
    -- The NCBI Taxon ID is a unique identifier for a taxon in the NCBI Taxonomy database
    -- which may be NULL when this taxon is not present in the NCBI Taxonomy database.
    ncbi_taxon_id INTEGER
);"
);

assert_eq!(
    minified,
    "CREATE TABLE IF NOT EXISTS taxa(id UUID PRIMARY KEY,name TEXT NOT NULL,ncbi_taxon_id INT)"
);
```

If you want this to be done at compile time, you can use the [`minify_sql`](https://github.com/mvisani/SQL-minifier/blob/b22627d27905ea5ce92d3a683ac10d11bccbfae9/minify_sql_proc/src/lib.rs#L39) macro:
```rust
use sql_minifier::macros::minify_sql;

const SQL_CONTENT: &str = minify_sql!(
    "-- Your SQL goes here
CREATE TABLE IF NOT EXISTS taxa (
    -- The unique identifier for the taxon
    id UUID PRIMARY KEY,
    -- The scientific name of the taxon
    name TEXT NOT NULL,
    -- The NCBI Taxon ID is a unique identifier for a taxon in the NCBI Taxonomy database
    -- which may be NULL when this taxon is not present in the NCBI Taxonomy database.
    ncbi_taxon_id INTEGER
);"
);

assert_eq!(
    SQL_CONTENT,
    "CREATE TABLE IF NOT EXISTS taxa(id UUID PRIMARY KEY,name TEXT NOT NULL,ncbi_taxon_id INT)"
);
```

A more complex [SQL file](tests/test_file_3.sql) such as:
```sql
-- SQL defining the container_horizontal_rules table.
-- The container horizontal rules define whether an item type can be placed next to another item type.
-- For instance a acid product cannot be placed next to a base product. Generally speaking, most items
-- can be placed next to each other, but some items cannot be placed next to each other. These rules
-- are defined in the form of a deny-list, meaning that if a rule is not defined, then the item type
-- can be placed next to any other item type. The rules are defined by an admin user, and are used to
-- enforce the placement rules when creating or updating items. Some items may only be placed next to
-- items that are within a certain temperature, humidity, or pressure range. These constraints are also
-- defined in the container rules.
CREATE TABLE container_horizontal_rules (
    id UUID PRIMARY KEY REFERENCES describables(id) ON DELETE CASCADE,
    item_type_id UUID REFERENCES item_categories(id) ON
    DELETE
        CASCADE,
        other_item_type_id UUID REFERENCES item_categories(id) ON
    DELETE
        CASCADE,
        minimum_temperature FLOAT DEFAULT NULL,
        maximum_temperature FLOAT DEFAULT NULL,
        minimum_humidity FLOAT DEFAULT NULL,
        maximum_humidity FLOAT DEFAULT NULL,
        minimum_pressure FLOAT DEFAULT NULL,
        maximum_pressure FLOAT DEFAULT NULL,
        CHECK (
            minimum_temperature IS NULL
            OR maximum_temperature IS NULL
            OR minimum_temperature <= maximum_temperature
        ),
        /* The minimum humidity must be less than or
        equal to the maximum humidity. */
        CHECK (
            minimum_humidity IS NULL
            OR maximum_humidity IS NULL
            OR minimum_humidity <= maximum_humidity
        ),
        CHECK (
            minimum_pressure IS NULL
            OR maximum_pressure IS NULL
            OR minimum_pressure <= maximum_pressure
        )
);
/* and other multiline comment */
```

We can load it and minify it at compile time using the [`load_sql`](https://github.com/mvisani/SQL-minifier/blob/b22627d27905ea5ce92d3a683ac10d11bccbfae9/load_sql_proc/src/lib.rs#L26) macro:
```rust
use sql_minifier::macros::load_sql;

const SQL_CONTENT: &str = load_sql!("tests/test_file_3.sql");

assert_eq!(
    SQL_CONTENT,
    "CREATE TABLE container_horizontal_rules(id UUID PRIMARY KEY REFERENCES describables(id)ON DELETE CASCADE,item_type_id UUID REFERENCES item_categories(id)ON DELETE CASCADE,other_item_type_id UUID REFERENCES item_categories(id)ON DELETE CASCADE,minimum_temperature FLOAT DEFAULT NULL,maximum_temperature FLOAT DEFAULT NULL,minimum_humidity FLOAT DEFAULT NULL,maximum_humidity FLOAT DEFAULT NULL,minimum_pressure FLOAT DEFAULT NULL,maximum_pressure FLOAT DEFAULT NULL,CHECK(minimum_temperature IS NULL OR maximum_temperature IS NULL OR minimum_temperature<=maximum_temperature),CHECK(minimum_humidity IS NULL OR maximum_humidity IS NULL OR minimum_humidity<=maximum_humidity),CHECK(minimum_pressure IS NULL OR maximum_pressure IS NULL OR minimum_pressure<=maximum_pressure))"
);
```

## Features
We support the following features:
- `gluesql`: When enabled, the minifier will not minify BOOLEAN keywords to BOOL, as it is not supported by [GlueSQL](https://gluesql.org/docs/0.14/).