================================================================================
Join
================================================================================

from employees
join positions (employees.id==positions.employee_id)

--------------------------------------------------------------------------------

(program
  (pipeline
    (from
      (keyword_from)
      (identifier))
    (transforms
      (joins
        (keyword_join)
        (term
          (identifier))
        (conditions
          (binary_expression
            (field
              (identifier)
              (identifier))
            (field
              (identifier)
              (identifier))))))))

================================================================================
Join with direction
================================================================================

from employees
join side:left positions (employees.id==positions.employee_id)

--------------------------------------------------------------------------------

(program
  (pipeline
    (from
      (keyword_from)
      (identifier))
    (transforms
      (joins
        (keyword_join)
        (keyword_side)
        (keyword_left)
        (term
          (identifier))
        (conditions
          (binary_expression
            (field
              (identifier)
              (identifier))
            (field
              (identifier)
              (identifier))))))))

================================================================================
Joins with alias
================================================================================

from employees
join side:left p=positions (employees.id==p.employee_id)

--------------------------------------------------------------------------------

(program
  (pipeline
    (from
      (keyword_from)
      (identifier))
    (transforms
      (joins
        (keyword_join)
        (keyword_side)
        (keyword_left)
        (term
          (identifier)
          (identifier))
        (conditions
          (binary_expression
            (field
              (identifier)
              (identifier))
            (field
              (identifier)
              (identifier))))))))

================================================================================
Inner joins
================================================================================

from employees
join positions (==emp_no)

--------------------------------------------------------------------------------

(program
  (pipeline
    (from
      (keyword_from)
      (identifier))
    (transforms
      (joins
        (keyword_join)
        (term
          (identifier))
        (conditions
          (term
            (field
              (identifier))))))))
