Releases: beamlynx/pine-lang
Releases · beamlynx/pine-lang
Release list
0.33.0
[0.33.0] - 2026-04-20
Added
- Column hints for the
update!/u!operation. Typingu!oru! col = val,now suggests remaining assignable columns, excluding those already assigned.
Changed
- The
=> countin thegroupoperation is now optional.countis used by default when omitted:
email | g: status
[0.32.0] - 2026-03-30
Added
- Multi-table
update!support: when assignments target different tables (e.g.c.deleted_atandd.deleted_at), multiple UPDATE queries are run—one per table. - API eval response for
update!now includes per-table results:[["Table" "Rows updated"] ["company" 5] ["document" 3]].
Fixed
- Recursive delete no longer follows heuristic relations — only real foreign key constraints are traversed. Heuristic relations are now flagged in
ast.hints.tablevia aheuristicboolean so clients can distinguish them. update!now uses the table alias when columns are qualified (e.g.c.name), so updates target the correct table when multiple tables are in context:
company as c | w: id = 1 | document | w: type = 'invoice' | update! c.deleted_at = '2026-01-01'
[0.31.0] - 2026-02-16
Added
Build endpoint returns:
- Prettified expression in the
ast.prettifiedproperty. - Ranges for the operations in the
ast.rangesproperty.
[0.30.0] - 2026-02-04
Added
- Support for heuristic relations based on column naming conventions. This is helpful when foreign keys are not explicitly specified.
[0.29.0] - 2025-12-25
Added
- Support for cursor position aware hints. This is helpful when the user isn't at the end of the expression. Hints are generated based on the cursor position. The build endpoint supports a new parameter
cursorwhich must contain thelineandcharacterposition of the cursor.
[0.28.0] - 2025-12-08
Added
- Support for date extraction functions in the select operation e.g.
employee | select: created_at => year
employee | select: created_at => year as created_at_year
Supported functions are: year, month, week, day, hour, minute
- Group on derived columns e.g.
employee | select: created_at => month | group: month => count
- Explicit join columns are supported in the join operation e.g.
company | employee .company_id = .id
Removed
- Internal state field
:join-maphas been removed. This was legacy dead code kept since v0.8.0 that was never actually used. The:joinsvector format continues to be used for SQL generation.
[0.27.0] - 2025-10-19
Added
- Column aliases are supported in the order operation e.g.
company as c | o: c.name asc
- Support comments in the expressions e.g.
company | -- This is a line comment
company | /* This is a multi-line block comment */
[0.26.1] - 2025-09-07
Changed
- Using a readonly db user for the playground
[0.26.0] - 2025-09-06
Added
- Support for raw SQL queries:
POST /api/v1/sql
[0.25.0] - 2025-08-28
Added
- Values are type casted to the appropriate database column type.
Fixed
-
As we use the correct typecase for the values, it is possible to update a jsonb column.
-
It is possible to use a LIKE operator on a uuid using a type cast e.g.
company | where: id like '9cd%' ::uuid
[0.24.0] - 2025-08-25
Added
- Support for
update!operation:
customers | w: id = 1 | update! name = 'John Doe'
- Return id columns for all tables in the result. This allows in-place updates on a query result.
Fixed
- All columns were being returned in some cases instead of the explicitly selected columns. e.g.
company | s: id,
company | s: id | l: 1
[0.23.0] - 2025-08-15
Added
- Setup for playground
Fixed
- Numbers are parsed as longs e.g. if the column is an integer:
customers | id = 1
0.22.0
[0.22.0] - 2025-07-12
Added
- Column hints for
where:operation, supporting partial expressions:
company | where: # Shows all columns
company | w: i # Shows columns matching 'i' (like 'id')
company | w: id = # Shows all columns after specifying column + operator
y.employee | w: comp # Shows columns matching 'comp' (like 'company_id')
[0.21.0] - 2025-07-02
Fixed
- Docker image wasn't running.Updated the base image to
openjdk:11-jre-slim
Added
- Support for
ilike,not like, andnot ilikeoperators:
company | where: name ilike 'acme%'
company | where: name not like 'test%'
company | where: name not ilike 'admin%'
- Support for casting columns as
::uuid - Support for dates in conditions e.g.
company | where: created_at > '2025-01-01' | created_at < '2026-01-01'
0.20.0
[0.20.0] - 2025-06-22
Added
- Specify join types i.e.
LEFT JOINorRIGHT JOIN:
x | y :left
x | y :right
Breaking
- Syntax for specifying parent and child relations is changed (introduced in
0.6.0). This avoids the need for backtracking.
x | of: y
x | has: y
is now:
x | y :parent
x | y :child
^is removed from the syntax to specific the directionality of the join. (introduced in0.6.0)
[0.19.0] - 2025-06-21
Added
- Support for casting columns in conditions e.g.
company | where: id like '9cd%' ::text
[0.18.0] - 2025-06-04
Added
- Support for
groupoperation:
email | group: status => count
- Column aliases are supported in conditions e.g.
tenant as t | company | where: t.id = 'xxx'
Changed
- Default limit is removed for
count:anddelete:operations. - For
count:operations, thewithSQL clause is used to build the nested query e.g.
company | count:
is evaluated to:
WITH x AS (SELECT * FROM "public"."company") SELECT COUNT(*) FROM x;0.17.0
[0.17.0] - 2025-05-03
Fixed
- Using database connection pooling
- Using UTC dates
0.16.0
[0.16.0] - 2025-02-09
Added
- Support for connection stats which contain the number of db connections.
GET /connection/stats
{
"connection-count": 10,
"time": "2025-02-10T01:49:53.808120858"
}
0.14.0
[0.14.0] - 2025-01-07
Added
- Support for columns e.g. hints are generated for a partial select:
company | s:
company | s: id,
Changed
- Connection id format is
host:portinstead of just thehost.
[0.13.0] - 2024-10-25
Added
- DB connection management i.e. create a new connection and connect to it
POST /connections
POST /connections/:id/connect
- Support for booleans:
company | is_public = true
[0.12.0] - 2024-10-18
Added
- Support for
not inoperator - Support for no operations e.g.
delete:. Such operations are evaluated client side.
[0.11.0] - 2024-09-12
Added
where:supports comparing values between columns of different tables
folder as f | document | where: name = f.name
folder as f | document | name != f.name
[0.10.0] - 2024-09-12
Added
- Support for
count::
company | count:
0.9.0
Added
- Support for
NULL:
company | name is null
company | name = null
company | name is not null
- Support for
order:
company | order: created_at
company | order: country, created_at asc
0.8.1
[0.8.1] - 2024-07-30
Fixed
- Specifying the join column in case of ambigious relations wasn't working.
[0.8.0] - 2024-07-30
Added
- Change the context using the
from:keyword. This is helpful when the tables relations are not linear and look like a tree.
company as c | document | from: c | employee
Breaking
- State:
joinsis a vector e.g.[ "x" "y" ["x" "id" :has "y" "x_id"]]
Changed
- State:
join-mapis kept for legacy reasons but it is only used internally.
[0.7.2] - 2024-07-26
Changed
- No difference in functionality. Removed a lot of deprecated code - only keeping the code for reborn.
[0.7.1] - 2024-07-26
Fixed
- Allow spaces in the start of a pine expression
[0.7.0] - 2024-07-26
Added
- Support for
inoperator
Changed
- Error type is returned. It is either nothing or
parse.
[0.6.0] - 2024-07-22
Added
- Support for directional joins:
employee | has: employee
employee | of: employee
employee | employee^
- Columns can be qualified by table aliases:
employee as e | s: e.name
[0.5.4] - 2024-07-16
Fixed
- Incorrect hints were generated in case of ambiguity
[0.5.3] - 2024-07-16
Fixed
- Incorrect schema being returned in hints when joining from child to parent
[0.5.2] - 2024-07-14
Changed
- Default
limitis250if not specified
Fixed
- All columns weren't being select in some cases e.g. using
company | s: id | employee, the columns fromemployeetable weren't being selected
[0.5.1] - 2024-07-11
Added
- Context sensitive columns selection e.g.
company | s: id | employee | s: id
[0.5.0] - 2024-07-10
Added
- Hints can be provided to resolve ambigious joins e.g. instead of
company | employee, you can explicitly specify the join column i.e.column | employee .company_id - The delete operation uses a nested query. The column used for deletes must be specified:
public.company | delete! .id
evaluates to:
DELETE FROM
"public"."company"
WHERE
"id" IN (
SELECT
"c_0"."id"
FROM
"public"."company" AS "c_0"
);- Conditions can be composed. Following are allowed:
company | where: id='xxx'
company | w: id='xxx'
company | id='xxx'
Changed
- Conditions can't be combined with the tables e.g.
company id='xxx'. Instead compose them using pipes:company | id='xxx' - Double quotes around strings aren't supported anymore. Use single quotes i.e. instead of
id="xxx", useid='xxx'
Removed
- Support for
group,order,set!is dropped. It will be added soon in the up coming versions. - Context sensitive columns selection
0.4.0
Added
- Disabled CORS
- API endpoint for getting the active connection:
GET /connection
{
...
"connection-id": "..."
}
- When using
POST /buildthe response also includes theconnection-id, andparams - When using
POST /evalthe response also includes theconnection-id,query, andparams. - In case of an error, it is handled and the error message is returned in the API response as
error - Limited support for showing hints based on the input
Fixed
- Pine expression build/eval was failing if the db connection isn't initialized
- An error was being thrown when using
uuidvalues in the expressions:operator does not exist: uuid = character varying - Order of the columns in the result was sometimes not the same as the order in the query. Also, all columns are explicitly selected in the sql instead of relying on
*
0.3.1
What's Changed
- Feat/support multiple connections/1 by @ahmadnazir in #9
- Added endpoint for evaluating pine expressions by @ahmadnazir in #12
- Using json objects for responses by @ahmadnazir in #13
- Feat/set connection via api/1 by @ahmadnazir in #14
- API endpoint for getting connection ids to choose from by @ahmadnazir in #16
Full Changelog: 0.3.0...0.3.1