> ## Documentation Index
> Fetch the complete documentation index at: https://docs.powersync.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Case Sensitivity

> Handle case-sensitive table and column names in PowerSync Sync Streams/Rules, with best practices for lowercase identifiers and quoting strategies.

### Case in Sync Rules

PowerSync converts all table/collection and column/field names to lower-case by default in Sync Rule queries (this is how Postgres also behaves). To preserve the case, surround the names with double quotes, for example:

```sql theme={null}
SELECT "ID" as id, "Description", "ListID" FROM "TODOs" WHERE "TODOs"."ListID" = bucket.list_id
```

When using `SELECT *`, the original case is preserved for the returned columns/fields.

### Client-Side Case

On the client side, the case of table and column names in the [client-side schema](/intro/setup-guide#define-your-client-side-schema) must match the case produced by Sync Rules exactly. For the above example, use the following in Dart:

```dart theme={null}
  Table('TODOs', [
    Column.text('Description'),
    Column.text('ListID')
  ])
```

SQLite itself is case-insensitive. When querying and modifying the data on the client, any case may be used. For example, the above table may be queried using `SELECT description FROM todos WHERE listid = ?`.

Operations (`PUT`/`PATCH`/`DELETE`) are stored in the upload queue using the case as defined in the schema above for table and column names, not the case used in queries.

As another example, in this Sync Rule query:

```sql theme={null}
SELECT ID, todo_description as Description FROM todo_items as TODOs
```

Each identifier in the example is unquoted and converted to lower case. That means the client-side schema would be:

```dart theme={null}
Table('todos', [
  Column.text('description')
])
```
