Qcert.SQL.Lang.SQL



Section SQL.



  Context {fruntime:foreign_runtime}.



  Definition sql_env := list (string × data).
  Definition sql_table_spec : Set := string × (option (list string)).
  Definition sql_order_spec : Set := SortCriterias.
  Inductive sql_bin_cond : Set :=
  | SEq | SLe | SLt | SGe | SGt | SDiff
  | SBinaryForeignCond (fb : foreign_binary_op_type) : sql_bin_cond.
  Inductive sql_un_expr : Set :=
  | SMinus : sql_un_expr
  | SSubstring : Z option Z sql_un_expr
  | SUnaryForeignExpr (fu:foreign_unary_op_type) : sql_un_expr.
  Inductive sql_bin_expr : Set :=
  | SPlus | SSubtract | SMult | SDivide
  | SConcat
  | SBinaryForeignExpr (fb : foreign_binary_op_type) : sql_bin_expr.
  Inductive sql_agg : Set := | SSum | SAvg | SCount | SMin | SMax.

  Inductive sql_distinct : Set := SDistinct | SAll.

  Inductive sql_query : Set :=
  | SQuery :
      list sql_select
      list sql_from
      option sql_condition
      option ((list string) × (option sql_condition))
      option sql_order_spec sql_query
  | SUnion :
      sql_distinct sql_query sql_query sql_query
  | SIntersect :
      sql_distinct sql_query sql_query sql_query
  | SExcept :
      sql_distinct sql_query sql_query sql_query
  with sql_select : Set :=
  | SSelectColumn : string sql_select
  | SSelectColumnDeref : string string sql_select
  | SSelectStar : sql_select
  | SSelectExpr : string sql_expr sql_select
  with sql_from : Set :=
  | SFromTable : string sql_from
  | SFromTableAlias : string string sql_from
  | SFromQuery : sql_table_spec sql_query sql_from
  with sql_condition : Set :=
  | SCondAnd : sql_condition sql_condition sql_condition
  | SCondOr : sql_condition sql_condition sql_condition
  | SCondNot : sql_condition sql_condition
  | SCondBinary : sql_bin_cond sql_expr sql_expr sql_condition
  | SCondExists : sql_query sql_condition
  | SCondIn : sql_expr sql_expr sql_condition
  | SCondLike : sql_expr string sql_condition
  | SCondBetween : sql_expr sql_expr sql_expr sql_condition
  with sql_expr : Set :=
  | SExprConst : data sql_expr
  | SExprColumn : string sql_expr
  | SExprColumnDeref : string string sql_expr
  | SExprStar : sql_expr
  | SExprUnary : sql_un_expr sql_expr sql_expr
  | SExprBinary : sql_bin_expr sql_expr sql_expr sql_expr
  | SExprCase : sql_condition sql_expr sql_expr sql_expr
  | SExprAggExpr : sql_agg sql_expr sql_expr
  | SExprQuery : sql_query sql_expr
  .

  Inductive sql_statement : Set :=
  | SRunQuery : sql_query sql_statement
  | SCreateView : string sql_query sql_statement
  | SDropView : string sql_statement
  .

  Definition sql : Set := list sql_statement.

  Fixpoint is_singleton_sql_query (q:sql_query) : bool :=
    match q with
    | SUnion _ _ _false
    | SIntersect _ _ _false
    | SExcept _ _ _false
    | SQuery (SSelectExpr _ expr :: nil) _ _ None None
      is_singleton_sql_expr expr
    | SQuery _ _ _ _ _false
    end
  with is_singleton_sql_expr (expr:sql_expr) : bool :=
    match expr with
    | SExprConst _true
    | SExprColumn _false
    | SExprColumnDeref _ _false
    | SExprStarfalse
    | SExprUnary _ expr1
      is_singleton_sql_expr expr1
    | SExprBinary _ expr1 expr2
      is_singleton_sql_expr expr1 && is_singleton_sql_expr expr2
    | SExprCase _ expr1 expr2
      is_singleton_sql_expr expr1 && is_singleton_sql_expr expr2
    | SExprAggExpr _ _true
    | SExprQuery qis_singleton_sql_query q
    end.


  Fixpoint is_value_sequence_sql_query (q:sql_query) : bool :=
    match q with
    | SUnion _ q1 q2
      if is_value_sequence_sql_query q1
      then is_value_sequence_sql_query q2
      else false
    | SIntersect _ q1 q2
      if is_value_sequence_sql_query q1
      then is_value_sequence_sql_query q2
      else false
    | SExcept _ q1 q2
      if is_value_sequence_sql_query q1
      then is_value_sequence_sql_query q2
      else false
    | SQuery (SSelectExpr _ expr :: nil) _ _ _ _
      if (is_singleton_sql_expr expr) then false else true
    | SQuery (SSelectColumn _ :: nil) _ _ _ _true
    | SQuery (SSelectColumnDeref _ _ :: nil) _ _ _ _true
    | SQuery _ _ _ _ _false
    end.

End SQL.