sql-cli 1.72.0

SQL query tool for CSV/JSON with both interactive TUI and non-interactive CLI modes - perfect for exploration and automation
Documentation
# Solar System Functions Usage Guide

## Available Functions

All functions take a solar body name (string) as input:

- `MASS_SOLAR_BODY(name)` - Returns mass in kg
- `RADIUS_SOLAR_BODY(name)` - Returns radius in meters  
- `GRAVITY_SOLAR_BODY(name)` - Returns surface gravity in m/s²
- `DISTANCE_SOLAR_BODY(name)` - Returns distance from Sun in meters
- `ORBITAL_PERIOD_SOLAR_BODY(name)` - Returns orbital period in days
- `DENSITY_SOLAR_BODY(name)` - Returns density in kg/m³
- `ESCAPE_VELOCITY_SOLAR_BODY(name)` - Returns escape velocity in m/s
- `ROTATION_PERIOD_SOLAR_BODY(name)` - Returns rotation period in hours
- `MOONS_SOLAR_BODY(name)` - Returns number of moons

## Supported Solar Bodies

- **Star**: Sun
- **Planets**: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
- **Dwarf Planets**: Pluto, Ceres, Eris
- **Moon**: Moon

## What Works ✅

### Functions in SELECT clause
```sql
SELECT name, GRAVITY_SOLAR_BODY(name) AS gravity
FROM test;
```

### Functions in WHERE clause
```sql
SELECT name 
FROM test
WHERE GRAVITY_SOLAR_BODY(name) > 9.807;
```

### Functions in CASE expressions
```sql
SELECT name,
  CASE 
    WHEN GRAVITY_SOLAR_BODY(name) < 2 THEN 'Low gravity'
    WHEN GRAVITY_SOLAR_BODY(name) < 10 THEN 'Earth-like'
    ELSE 'High gravity'
  END AS gravity_class
FROM test;
```

### Functions in calculations
```sql
SELECT name,
  ROUND(MASS_SOLAR_BODY(name) / MASS_SOLAR_BODY('Earth'), 2) AS earth_masses,
  ROUND(100 * GRAVITY_SOLAR_BODY(name) / 9.807, 1) AS weight_kg
FROM test;
```

### ORDER BY column aliases
```sql
SELECT name, GRAVITY_SOLAR_BODY(name) AS g
FROM test
ORDER BY g DESC;  -- Works: ordering by alias
```

## What Doesn't Work ❌

### ORDER BY function calls directly
```sql
-- This will fail:
SELECT name FROM test
ORDER BY GRAVITY_SOLAR_BODY(name);  -- Error: Column 'GRAVITY_SOLAR_BODY' not found
```

### Functions as LAG/LEAD arguments
```sql
-- This will fail:
SELECT LAG(GRAVITY_SOLAR_BODY(name), 1) OVER (ORDER BY position)
FROM test;  -- Error: LAG first argument must be a column
```

## Example Queries

### Find high-gravity worlds
```sql
SELECT name, 
       ROUND(GRAVITY_SOLAR_BODY(name), 2) AS gravity_ms2,
       ROUND(GRAVITY_SOLAR_BODY(name) / 9.807, 2) AS earth_g
FROM test
WHERE GRAVITY_SOLAR_BODY(name) > 9.807
ORDER BY gravity_ms2 DESC;
```

### Compare planet sizes
```sql
SELECT name,
       ROUND(RADIUS_SOLAR_BODY(name) / RADIUS_SOLAR_BODY('Earth'), 2) AS earth_radii
FROM test
WHERE type = 'Terrestrial'
ORDER BY earth_radii DESC;
```

### Calculate your weight on different worlds
```sql
SELECT name,
       ROUND(100 * GRAVITY_SOLAR_BODY(name) / 9.807, 1) AS your_weight_kg
FROM test
WHERE type IN ('Terrestrial', 'Dwarf Planet')
ORDER BY your_weight_kg DESC;
```

### Verify Kepler's Third Law
```sql
SELECT name,
       ROUND(DISTANCE_SOLAR_BODY(name) / AU(), 2) AS distance_au,
       ROUND(ORBITAL_PERIOD_SOLAR_BODY(name) / 365.256, 2) AS period_years,
       ROUND(POW(ORBITAL_PERIOD_SOLAR_BODY(name) / 365.256, 2) / 
             POW(DISTANCE_SOLAR_BODY(name) / AU(), 3), 3) AS keplers_constant
FROM test
WHERE type IN ('Terrestrial', 'Gas Giant')
ORDER BY distance_au;
```

## Tips

1. Always use column aliases when you need to ORDER BY a function result
2. Function names are case-insensitive: `gravity_solar_body('earth')` works too
3. Body names are also case-insensitive: 'Earth', 'EARTH', 'earth' all work
4. Use with other functions like `PI()`, `POW()`, `AU()`, `LIGHT_YEAR()` for complex calculations
5. Combine with window functions using the regular columns from your CSV

## Running the Examples

```bash
# Load data and run queries interactively
./target/release/sql-cli examples/solar_system.csv

# Run a single query
./target/release/sql-cli examples/solar_system.csv -q "SELECT name, GRAVITY_SOLAR_BODY(name) FROM test"

# Run the full example script
./target/release/sql-cli examples/solar_system.csv < examples/solar_system_calculations.sql
```