dehowef opened a new issue, #1008:
URL: https://github.com/apache/age/issues/1008

   **Describe the bug**
   AGE relies on implicit casting to smoothly implement PG-type booleans. AG 
types may be implicitly cast to a boolean type.  This has proven to not be an 
issue in most cases, but does cause unexpected behavior in 
transform_BoolExpr(). transform_BoolExpr uses PG's coerce_to_boolean() to check 
if agtypes can be cast to a boolean type, and because AGE allows implicit 
castring, there are cases that do not throw an error where it normally would be 
expected to.
   
   In the case of logical gates, this causes the following unexpected behavior:
   ```
   SELECT * from cypher('my_graph_name', $$
    RETURN true OR 1
   $$) as (a agtype);
   ```
   
   The previous query would be expected to throw a type compatibility error, 
but instead it returns 'TRUE'
   
   Similarly,
   ```
   SELECT * from cypher('my_graph_name', $$
    RETURN FALSE AND 1
   $$) as (a agtype);
   ```
   
   would be expected to throw a type compatibility error, but instead it 
returns FALSE.
   
   The inverse of these two queries,  RETURN 1 OR true, and RETURN 1 and false 
throw an error:
   ```
    ERROR:  cannot cast agtype integer to type boolean
    STATEMENT:  SELECT * FROM cypher('empty', $$ RETURN 1 OR true $$) as (a 
agtype);
    ERROR:  cannot cast agtype integer to type boolean
   ``
   
   Because of the associativity of logical operators (left associativity), the 
boolean expression is optimized to pass or fail as soon as either condition is 
validated. But, this is an execution phase error.
   
   The error that coerce_to_boolean would throw is:
   
   ```
   ERROR:     argument of OR must be type boolean, not type integer at 
character 8
   STATEMENT:    SELECT 1 OR TRUE
   ERROR: argument of OR must be type boolean, not type integer
   ```
   
   which would be an error thrown during the transform phase rather than during 
execution. Since AGE's constraint logic (WHERE, property constraints, etc), 
rely on implicit boolean casting, resolving this specific edge case may require 
modifying logic during the execution phase.
   
   **How are you accessing AGE (Command line, driver, etc.)?**
   - Command Line
   
   **What data setup do we need to do?**
   This can be run on an instance of AGE installed via command line with no 
data setup required.
   
   **What is the necessary configuration info needed?**
   - Install AGE.
   
   **What is the command that caused the error?**
   
   Denoted above, but here is one of the problem commands stated again:
   
   ```pgsql
   SELECT * from cypher('my_graph_name', $$
    RETURN FALSE AND 1
   $$) as (a agtype);
   ```
   
   **Expected behavior**
   We'd expect coerce_to_boolean or another function in the transform phase to 
throw a type mismatch error, something along the lines of:
   
   ```
   ERROR:     argument of OR must be type boolean, not type integer at 
character 8
   STATEMENT:    SELECT 1 OR TRUE
   ERROR: argument of OR must be type boolean, not type integer
   ```
   
   **Environment (please complete the following information):**
   - Version: latest main branch
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@age.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to