packages feed

ClickHaskell-1.1.0: ChangeLog.md

# 1.1.0 -- 11-07-2026

## Fixes:
- Fixed `Array(T)` serialization for blocks containing more than one row (tests extended)

## Features:
- Added support for `Float(32/64)`, `Decimal(32,64,128,256)`, `Int256`, `Date` column types
- Added support for `Int64`, `Float/Double` settings
- Added support for query parameters

## Breaking changes:
- Reworked the query serialization type class to support query parameters.

  `toQueryPart` no longer quotes 128-bit and 256-bit integer values. Previously this was introduced as part of a fix for serializing values larger than `999999999999999934463`.

  Added a separate `toQueryPartQuoted` method for serializing quoted values.

  Internal wrappers have been updated to use `toQueryPartQuoted` where appropriate, so existing code should continue to work unless you implemented custom wrappers around `toQueryPart`.

# 1.0.0 -- 14-12-2025

## Fixes:
- Fixed unexpected behavior when the number of result columns was different from expected.
  A `UserError` exception `UnmatchedColumnsCount` is now raised in such cases (+ added test)
- Query serialization for UInt128 bigger than 999999999999999934463 (+ added test)

## Features:
- Support and CI for GHCs: `9.12.2`
- ~50% optimization of select/insert time and alloc (perf test №1)
- Added function `command` for statements with no result
- Added `Bool`, `DateTime64`, `UInt256`, `Enum8`, `Enum16` types support
- Added `Array(T)` partial support (only for primitive types)
- Added partial support for settings passing (watch `addSetting` function)
- Added TLS support (see separate package [ClickHaskell-tls](https://hackage.haskell.org/package/ClickHaskell-tls))
- Improved ClickHaskell typeclass resolution errors in HLS session

## Breaking changes:
- ### select/insert API changes
  - `insert` and `select` no longer accept raw queries
  - The following functions were removed:
    `selectFrom`, `selectFromView`, `generateRandom`, `insertInto`.
  - Now you should use statement generators instead:
    - `select` with `fromTable`, `fromView`, `fromGenerateRandom`, `unsafeMkSelect`
    - `insert` with `intoTable`, `unsafeMkInsert`
- ### Generic API changes
  `ReadableFrom` and `WritableInto` was replaced with `ClickHaskell`\
  Now you should declare single instance for every API parts
  ```haskell
  data MyData =
    ...
    deriving (Generic)
    deriving anyclass (ClickHaskell ExampleColumns)
  ```
  ```haskell
  data MyData =
    ...
    deriving (Generic)
    deriving anyclass
      ( ReadableFrom (Columns ExampleColumns)
      , WritableInto (Table "profiler" ExampleColumns)
      )
  ```
- ### `Serializable` type class was unexported
- ### `DeserializableColumn` type class was renamed to `SerializableColumn`
- ### `IsChType` instance changes
  `ToChType` type family was deleted
- ### `FromChType` typeclass merged into `ToChType`
- ### `parameter` function now doesn't apply toChType
- ### Connection initialization API changes
  1. `ChCredential` renamed to `ConnectionArgs`
  2. `defaultCredentials` renamed to `defaultConnectionArgs`
  3. `openNativeConnection` renamed to `openConnection`
  4. `ConnectionArgs` constructor now are not exported

     You need to use new modifiers:\
     `setHost`, `setPort`, `setUser`, `setDatabase`, `setPassword`

     Connection initialization example:
     ```haskell
     initMyConnection :: IO Connection
     initMyConnection = do
       connection <-
         openConnection
           . setUser "default"
           . setPassword ""
           . setDatabase "default"
           . setPort "9000"
           . setHost "localhost"
           $ defaultConnectionArgs
       pure connection
     ```
- ### `client_name` format was changed
  from `ClickHaskell-x.y.z` to `ClickHaskell`

# 0.2.0 -- 23-03-2025

ClickHaskell documentation got it's own domain name: https://clickhaskell.dev/


## Fixes:
- Improved multithreading connection usage (+ added test)
- Unexpected behavior on expected and result column type mismatches (+ added test)

## Features:
- Additional GHC versions tests: `9.4.8`, `9.8.4`, `9.10.1`
- Query serialization support for UUID (+ added test)
- Export of client errors for exception handling
- Dropped vector dependency
- Introduced memory consumption test (64M limit) on parallel reading and writing of 1 million rows
- Added new reading wrapper for generateRandom function
- Depricating `Ch*` prefixes on types:
  - `ChUInt*` -> `UInt*` (type synonyms to Word*)
  - `ChInt*` -> `Int*` (reexport of Data.Int)
  - `ChDate` -> `Date` (ClickHaskell type)
  - `ChDateTime` -> `DateTime` (ClickHaskell type)
  - `ChArray` -> `Array` (ClickHaskell type)
  - `ChUUID` -> `UUID` (ClickHaskell type)
- openNativeConnection now passes $HOME and $USERNAME variables to query info

## Breaking changes:
- ### New UserErrors on types and columns names missmatches
  This change helps protect a user from unexpected behavior
  `UnmatchedType` error occurs when the expected type doesn't match the resulting one
  `UnmatchedColumn` error occurs when the expected column name doesn't match the resulting one
  ```haskell
  data ExpectedName = MkExpectedName
    { expectedName :: ChInt64
    }
    deriving (Generic)
    deriving anyclass (ReadableFrom (Columns ExpectedColumns))

  type ExpectedColumns = '[ Column "expectedName" ChInt64]

  -- Will throw UnmatchedColumn
  void $
    select
        @ExpectedColumns @ExpectedName connection
        (toChType "SELECT * FROM generateRandom('unexpectedName Int64', 1, 10, 2) LIMIT 1")
        pure

  -- Will throw UnmatchedType
  void $
    select
      @ExpectedColumns @ExpectedName connection
      "SELECT * FROM generateRandom('expectedName String', 1, 10, 2) LIMIT 1"
      pure
  ```

- ### Migration to streaming API
    The result of selects now exposes the block by block handling result. So you need to pass the handler and to process the list of results
    ```haskell
    result <-
      sum <$>
        select
          @ExampleColumns
          @ExampleData
          connection "\
          \SELECT * \
          \FROM generateRandom('a1 Int64', 1, 10, 2) \
          \LIMIT 1_000_00 \
          \ "
    ```
    now looks like
    ```haskell
    result <-
      sum <$>
        select
          @ExampleColumns
          @ExampleData
          connection "\
          \SELECT * \
          \FROM generateRandom('a1 Int64', 1, 10, 2) \
          \LIMIT 1_000_00 \
          \ "
          (pure . sum)
    ```

- ### DateTime type now parametrized with timezone
    Every DateTime type annotations
    ```haskell
    type A = ChDateTime -- DateTime
    type B = ChDateTime -- DateTime('UTC')
    ```
    should be changed with
    ```haskell
    type A = ChDateTime ""    -- DateTime
    type B = ChDateTime "UTC" -- DateTime('UTC')
    ```

- ### Migration to single module distribution
    You need to move all imports such as
    ```haskell
    import ClickHaskell.DbTypes (ChInt8)
    ```
    to ClickHaskell module
    ```haskell
    import ClickHaskell (ChInt8)
    ```

# 0.1.0 -- 04-12-2024

Initial release