Mapping

Naming conventions per target engine

How SQL Flow names schemas, tables, columns, topics and folders on each target engine, including case folding and long names.

When you don't set a name in Configure, SQL Flow chooses one. With the same engine on both sides it keeps the source name exactly. Across engines it adapts the name to the target's convention, so you can query the target without quoting every identifier.

Relational targets

TargetDefault schemaNames from another engineExample
PostgreSQLpublicsnake_casedbo.OrderItems → public.order_items
OracleThe target login's schemaUPPERCASEdbo.Orders → ORDERS in the login's schema
SQL Server, Azure SQL, SQL database in FabricdboUnchangedpublic.order_items → dbo.order_items
MySQLThe connection's databaseUnchangeddbo.Orders → Orders in the connection's database
Sybase ASEdboUnchangedpublic.orders → dbo.orders

Schemas

  • A table in the source's default schema goes to the target's default schema. The source defaults are dbo for SQL Server and Sybase ASE, public for PostgreSQL, and the source login's schema for Oracle.
  • A table in any other schema keeps its schema name, recased like the table. For example, SQL Server Sales.OrderItems becomes sales.order_items on PostgreSQL.
  • On a MySQL target, a schema is a database: a table in another schema goes to a database of that name.

Prepare target schema creates a missing schema on PostgreSQL, SQL Server, Azure SQL and SQL database in Fabric, and a missing database on MySQL. It never creates a schema on Oracle or Sybase ASE.

Columns

Columns follow the same rule as tables, with one exception. A source column whose name isn't in its engine's default case was created with quotes, and SQL Flow keeps it exactly:

Source columnTargetResult
SQL Server CustomerIdPostgreSQLcustomer_id
Oracle CUSTOMER_IDPostgreSQLcustomer_id
Oracle "CustomerId" (quoted, mixed case)PostgreSQL"CustomerId", unchanged
PostgreSQL customer_idSQL Servercustomer_id

SQL Server, MySQL and Sybase ASE don't fold names, so every column name from them is recased for PostgreSQL and Oracle targets.

Quoting, reserved words and special characters

SQL Flow quotes every name part it writes, with the target's own delimiters. A column named order or Line Total works on every target without changes.

SQL database in Fabric is the exception: it refuses column names that contain a space or any of , ; { } ( ) =, a tab or a newline. Rename such columns in Configure.

Long names

SQL Flow shortens names only for an Oracle source and a PostgreSQL target. A name longer than PostgreSQL's 63-byte limit keeps its beginning and ends with _ plus a hash of the full name. If two shortened column names collide, the table is refused:

Oracle identifier shortening produced a PostgreSQL column collision: <names>.

On every other route, names are written as they are, and the target engine's own identifier limit applies. Rename a table or column that is too long in Configure.

Name collisions

Automatic names can collide, for example Orders and orders from a case-sensitive source to PostgreSQL. SQL Flow doesn't detect this. Give one of the tables its own name in Configure.

Event and file targets

Unless you set a name in Configure, these targets name their output from the source table name as it was selected:

TargetNameExample for dbo.Orders with prefix cdc-
KafkaWith A topic per table: Topic prefix plus the source table name. With One topic for every table: the Fixed topic.cdc-dbo.Orders
Google Pub/Subprojects/<project>/topics/<prefix><table>, with each . in the table name replaced by -cdc-dbo-Orders
Fabric Open MirroringA landing folder: <table> for tables in dbo or public, <schema>.schema/<table> for othersOrders

SQL Flow doesn't create Kafka or Pub/Sub topics. Create them before the pipeline starts.

See also

If this was useful,
our newsletter will be too.

Get monthly insights on data engineering, AI, and building critical infrastructure - direct from the Spectral Core team and CEO Damir Bulic.