Skip to content

Calling table function with literal boolean value fails at runtime #1759

@velo

Description

@velo

Description

When calling a table function from another function with a literal boolean value (e.g., FALSE), the query compiles successfully but fails at runtime with an error about invalid integer input.

Reproduction

Given these two functions:

alerts(orgId String NOT NULL, projectId String NOT NULL, deploymentId String NOT NULL, includeSnoozed BOOLEAN NOT NULL, authOrgIds ARRAY<String> NOT NULL METADATA FROM 'auth.https://datasqrl.com/org_ids'):=
SELECT a.orgId, a.projectId, a.deploymentId,
       a.service, a.alertName,
       a.alertLevel AS alertLevelCode,
       CASE a.alertLevel WHEN 3 THEN 'ERROR' WHEN 2 THEN 'WARN' ELSE 'NOTICE' END AS alertLevel,
       a.alertTime, COALESCE(a.alertTime <= s.snoozeUntil, FALSE) AS isSnoozed
FROM _Alerts a
LEFT JOIN _AlertSnooze s ON a.deploymentId = s.deploymentId AND a.alertName = s.alertName
WHERE (
        (:deploymentId <> '' AND a.deploymentId = :deploymentId)
        OR (:deploymentId = '' AND :projectId <> '' AND a.projectId = :projectId)
        OR (:deploymentId = '' AND :projectId = '' AND :orgId <> '' AND a.orgId = :orgId)
      )
  AND (:includeSnoozed OR s.snoozeUntil IS NULL OR a.alertTime > s.snoozeUntil)
  AND (array_contains(cast(:authOrgIds as ARRAY<STRING>), a.orgId) OR array_contains(cast(:authOrgIds as ARRAY<STRING>), 'datasqrl_admin'))
ORDER BY a.projectId, a.deploymentId, a.alertName;

alertCount(orgId String NOT NULL, projectId String NOT NULL, deploymentId String NOT NULL, authOrgIds ARRAY<String> NOT NULL METADATA FROM 'auth.https://datasqrl.com/org_ids'):=
SELECT projectId, deploymentId,
       SUM(CASE alertLevelCode WHEN 3 THEN 1 ELSE 0 END) AS numErrors,
       SUM(CASE alertLevelCode WHEN 2 THEN 1 ELSE 0 END) AS numWarnings
FROM TABLE(alerts(:orgId, :projectId, :deploymentId, FALSE, :authOrgIds))
WHERE alertLevelCode >= 2
GROUP BY projectId, deploymentId
ORDER BY projectId, deploymentId;

The compilation succeeds, but at runtime the query fails with:

ERROR: invalid input syntax for type integer: "" (22P02)

Expected Behavior

Passing a literal FALSE (or TRUE) value when calling a table function should work correctly.

Workaround

Currently, the workaround is to duplicate the query logic instead of reusing the table function:

alertCount(orgId String NOT NULL, projectId String NOT NULL, deploymentId String NOT NULL, authOrgIds ARRAY<String> NOT NULL METADATA FROM 'auth.https://datasqrl.com/org_ids'):=
SELECT projectId, deploymentId,
       SUM(CASE alertLevel WHEN 3 THEN 1 ELSE 0 END) AS numErrors,
       SUM(CASE alertLevel WHEN 2 THEN 1 ELSE 0 END) AS numWarnings
FROM (
        SELECT a.projectId, a.deploymentId, a.alertLevel FROM _Alerts a
        LEFT JOIN _AlertSnooze s ON a.deploymentId = s.deploymentId AND a.alertName = s.alertName
        WHERE (
                (:deploymentId <> '' AND a.deploymentId = :deploymentId)
                OR (:deploymentId = '' AND :projectId <> '' AND a.projectId = :projectId)
                OR (:deploymentId = '' AND :projectId = '' AND :orgId <> '' AND a.orgId = :orgId)
              )
          AND (s.snoozeUntil IS NULL OR a.alertTime > s.snoozeUntil)
          AND (array_contains(cast(:authOrgIds as ARRAY<STRING>), a.orgId) OR array_contains(cast(:authOrgIds as ARRAY<STRING>), 'datasqrl_admin'))
     )
WHERE alertLevel >= 2
GROUP BY projectId, deploymentId
ORDER BY projectId, deploymentId;

Notes

This pattern works correctly when all parameters are passed as parameter references (e.g., :paramName), as seen in:

backendPendingDeploymentUpdates(authTenantId String NOT NULL METADATA FROM '...', authInstallationId String NOT NULL METADATA FROM '...') :=
SELECT * FROM Table(backendPendingDeploymentUpdatesWithTime(now(), :authTenantId, :authInstallationId));

The issue seems specific to passing literal boolean values.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions