From f1d3690f6a67e26b2c897cda66df7ca73243735a Mon Sep 17 00:00:00 2001 From: Shard Gupta Date: Tue, 8 Oct 2024 17:21:25 +0530 Subject: [PATCH 1/7] Delete partition table workaround page Remove entries for Fulltext search and GeoSpatial Signed-off-by: Shard Gupta --- _workaround/partitioned_table.md | 270 ------------------------------- _workaround/workarounds_toc.md | 4 +- extractor/overrides.cfg | 3 - 3 files changed, 1 insertion(+), 276 deletions(-) delete mode 100644 _workaround/partitioned_table.md diff --git a/_workaround/partitioned_table.md b/_workaround/partitioned_table.md deleted file mode 100644 index 5dc9bb58..00000000 --- a/_workaround/partitioned_table.md +++ /dev/null @@ -1,270 +0,0 @@ ---- -layout: default -title: Migrating partitioned tables to Babelfish -nav_order: 2 ---- - -## Migrating partitioned tables to Babelfish - -Note: This workaround applies to Babelfish clusters running in single-db mode. - -The primary difference between partitioned tables created on the Babelfish TDS port and partitioned tables created on the PostgreSQL port is the table owner. The examples that follow demonstrate changing the owner of the tables created on the PostgreSQL port to dbo, so you can access the tables on both the Babelfish port and the PostgreSQL port. - -### Range Partitioning Example - -The example that follows creates and tests a partitioned table with two partitions. First, use pgAdmin (on the PostgreSQL port) to create the table: - -```sql -DROP TABLE IF EXISTS dbo.PartitionTest; -DROP TABLE IF EXISTS dbo.PartitionTest_y2022m01; -DROP TABLE IF EXISTS dbo.PartitionTest_y2022m02; -DROP INDEX dbo.partitiontest_logdate_idx;` - -CREATE TABLE IF NOT EXISTS dbo.PartitionTest -( - city_id integer NOT NULL, - logdate date NOT NULL, - peaktemp integer, - unitsales integer -) PARTITION BY RANGE (logdate); - -CREATE INDEX PartitionTest_logdate_idx - ON dbo.PartitionTest(logdate ASC NULLS LAST); - -Then, create the partitions: - -CREATE TABLE IF NOT EXISTS dbo.PartitionTest_y2022m01 PARTITION OF dbo.PartitionTest - FOR VALUES FROM ('2022-01-01') TO ('2022-02-01'); - -CREATE TABLE IF NOT EXISTS dbo.PartitionTest_y2022m02 PARTITION OF dbo.PartitionTest - FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'); -``` - -Then, use pgAdmin to add data: - -```sql -INSERT INTO dbo.partitiontest VALUES (1,'2022-01-01',1,1); -INSERT INTO dbo.partitiontest VALUES (2,'2022-01-10',1,2); -INSERT INTO dbo.partitiontest VALUES (3,'2022-01-15',1,3); -INSERT INTO dbo.partitiontest VALUES (4,'2022-02-01',2,1); -INSERT INTO dbo.partitiontest VALUES (5,'2022-02-03',2,2); -INSERT INTO dbo.partitiontest VALUES (6,'2022-02-11',2,3); -INSERT INTO dbo.partitiontest VALUES (7,'2022-02-15',2,4); -INSERT INTO dbo.partitiontest VALUES (8,'2022-02-16',2,5); -INSERT INTO dbo.partitiontest VALUES (8,'2022-02-17',2,6); -INSERT INTO dbo.partitiontest VALUES (8,'2022-02-20',2,7); -INSERT INTO dbo.partitiontest VALUES (8,'2022-02-21',2,8); -``` - -When you query the data from pgAdmin and Babelfish: - -```sql -SELECT * FROM dbo.partitiontest -``` -• pgAdmin (on the PostgreSQL port) will display all the data. -• SSMS (on the Babelfish port) will display the following error message and the object browser will not display the table name: -```sql -Msg 33557097, Level 16, State 1, Line 3 -relation "master_dbo.partitiontest" does not exist -``` -Use pgAdmin (on the PostgreSQL port) to change the table owner to dbo: -```sql -ALTER TABLE dbo.partitiontest OWNER to dbo; -ALTER TABLE dbo.partitiontest_y2022m01 OWNER to dbo; -ALTER TABLE dbo.partitiontest_y2022m02 OWNER to dbo; -``` -Then, when you query the data from pgAdmin and SSMS: -```sql -SELECT * FROM dbo.partitiontest -``` -- pgAdmin (on the PostgreSQL port) will display all the data. -- SSMS (on the Babelfish port) will display the data and you should see the tables in the object browser. - -### Analyzing the result set - -First, query the database using SSMS on the TDS port: - -```sql -SET BABELFISH_SHOWPLAN_ALL ON - -SELECT * FROM dbo.partitiontest WHERE logdate = '2022-02-21' - -Query Text: Select * from dbo.partitiontest where logdate = '2022-02-21' -Bitmap Heap Scan on partitiontest_y2022m02 partitiontest (cost=4.22..14.76 rows=9 width=16) - Recheck Cond: (logdate = '2022-02-21'::date) - -> Bitmap Index Scan on partitiontest_y2022m02_logdate_idx (cost=0.00..4.22 rows=9 width=0) - Index Cond: (logdate = '2022-02-21'::date) -``` - -Then, using pgAdmin on the PostgreSQL port: - -```sql -EXPLAIN ANALYZE -SELECT * FROM dbo.partitiontest WHERE logdate = '2022-02-21' - -"Bitmap Heap Scan on partitiontest_y2022m02 partitiontest (cost=4.22..14.76 rows=9 width=16) (actual time=0.015..0.016 rows=1 loops=1)" -" Recheck Cond: (logdate = '2022-02-21'::date)" -" Heap Blocks: exact=1" -" -> Bitmap Index Scan on partitiontest_y2022m02_logdate_idx (cost=0.00..4.22 rows=9 width=0) (actual time=0.011..0.011 rows=1 loops=1)" -" Index Cond: (logdate = '2022-02-21'::date)" -"Planning Time: 0.124 ms" -"Execution Time: 0.043 ms" -``` - -### Inheritance Partitioning Example - -First, create the database objects that will be used in our example: -```sql -DROP TRIGGER IF EXISTS insert_measurement_trigger ON dbo.measurement_inheritance; -DROP FUNCTION IF EXISTS dbo.measurement_inheritance_insert_trigger(); -DROP TABLE IF EXISTS dbo.measurement_inheritance_y2006m02; -DROP TABLE IF EXISTS dbo.measurement_inheritance_y2006m03; -DROP TABLE IF EXISTS dbo.measurement_inheritance; -CREATE TABLE dbo.measurement_inheritance ( - city_id int not null, - logdate date not null, - peaktemp int, - unitsales int -); - -CREATE TABLE dbo.measurement_inheritance_y2006m02 ( - CHECK ( logdate >= DATE '2006-02-01' AND logdate < DATE '2006-03-01' ) -) INHERITS (dbo.measurement_inheritance); - -CREATE TABLE dbo.measurement_inheritance_y2006m03 ( - CHECK ( logdate >= DATE '2006-03-01' AND logdate < DATE '2006-04-01' ) -) INHERITS (dbo.measurement_inheritance); - -DROP INDEX IF EXISTS dbo_log_measurement_inheritance_y2006m02; -DROP INDEX IF EXISTS dbo_log_measurement_inheritance_y2006m03; - -CREATE INDEX dbo_log_measurement_inheritance_y2006m02 ON dbo.measurement_inheritance_y2006m02 (logdate); -CREATE INDEX dbo_log_measurement_inheritance_y2006m03 ON dbo.measurement_inheritance_y2006m03 (logdate); - - -CREATE OR REPLACE FUNCTION dbo.measurement_insert_trigger() -RETURNS TRIGGER AS $$ -DECLARE - year1 int; - month1 smallint; -BEGIN - year1 = EXTRACT(YEAR FROM new.logdate ); - month1 = EXTRACT(month FROM new.logdate ); - raise info 'year1 : % ',year1; - if month1<10 then - EXECUTE 'INSERT INTO dbo.measurement_inheritance_y'|| year1::varchar(4)||'m0'|| month1::varchar||' VALUES ('|| - NEW.city_id::varchar||','|| '''' ||NEW.logdate::date||'''' - ' ,'|| NEW.peaktemp::varchar||','||NEW.unitsales::varchar - || ')'; - ELSE - EXECUTE 'INSERT INTO dbo.measurement_inheritance_y'|| year1::varchar(4)||'m'|| month1::varchar||' VALUES ('|| - NEW.city_id::varchar||','|| '''' ||NEW.logdate::date||'''' - ' ,'|| NEW.peaktemp::varchar||','||NEW.unitsales::varchar - || ')'; -END IF; - -- 2008m01 VALUES (NEW.*); - RETURN NULL; -END; -$$ -LANGUAGE plpgsql; - -DROP TRIGGER IF EXISTS insert_measurement_trigger ON dbo.measurement_inheritance; - -CREATE TRIGGER insert_measurement_trigger - BEFORE INSERT ON dbo. measurement_inheritance - FOR EACH ROW EXECUTE FUNCTION dbo.measurement_insert_trigger(); -``` -Then, add half of the test data to the table using pgAdmin (on the PostgreSQL port): -```sql -INSERT INTO dbo.measurement_inheritance VALUES (1,'2006-02-01',1,1); -INSERT INTO dbo.measurement_inheritance VALUES (2,'2006-02-10',1,2); -INSERT INTO dbo.measurement_inheritance VALUES (3,'2006-02-15',1,3); -INSERT INTO dbo.measurement_inheritance VALUES (4,'2006-03-01',2,1); -INSERT INTO dbo.measurement_inheritance VALUES (5,'2006-03-03',2,2); -INSERT INTO dbo.measurement_inheritance VALUES (6,'2006-03-11',2,3); -INSERT INTO dbo.measurement_inheritance VALUES (7,'2006-03-15',2,4); -INSERT INTO dbo.measurement_inheritance VALUES (8,'2006-03-16',2,5); -INSERT INTO dbo.measurement_inheritance VALUES (8,'2006-03-17',2,6); -INSERT INTO dbo.measurement_inheritance VALUES (8,'2006-03-20',2,7); -INSERT INTO dbo.measurement_inheritance VALUES (8,'2006-03-21',2,8); -``` -Use pgAdmin to change the table owner to dbo: -```sql -ALTER FUNCTION dbo.measurement_insert_trigger() OWNER TO dbo; -ALTER TABLE dbo.measurement_inheritance OWNER to dbo; -ALTER TABLE dbo.measurement_inheritance_y2006m02 OWNER TO dbo; -ALTER TABLE dbo.measurement_inheritance_y2006m03 OWNER TO dbo; -``` -Add Data from SSMS: -```sql -INSERT INTO dbo.measurement_inheritance values (1,'2006-02-05',1,4); -INSERT INTO dbo.measurement_inheritance values (2,'2006-02-15',1,5); -INSERT INTO dbo.measurement_inheritance values (3,'2006-02-20',1,6); -INSERT INTO dbo.measurement_inheritance values (4,'2006-03-02',2,9); -INSERT INTO dbo.measurement_inheritance values (5,'2006-03-05',2,10); -INSERT INTO dbo.measurement_inheritance values (6,'2006-03-12',2,11); -INSERT INTO dbo.measurement_inheritance values (7,'2006-03-16',2,12); -INSERT INTO dbo.measurement_inheritance values (8,'2006-03-18',2,13); -INSERT INTO dbo.measurement_inheritance values (8,'2006-03-19',2,14); -INSERT INTO dbo.measurement_inheritance values (8,'2006-03-23',2,15); -INSERT INTO dbo.measurement_inheritance values (8,'2006-03-25',2,16); -``` - -Turn on the EXECUTE ANALYZE functionality, and query the data: -```sql -SET BABELFISH_SHOWPLAN_ALL on - -SELECT * FROM dbo.measurement_inheritance WHERE logdate ='2006-03-25'; -``` -### On-conflict Partitioning Example - -First, create the database objects that will be used in our example: -```sql -DROP TABLE IF EXISTS dbo.customers; - -CREATE TABLE dbo.customers ( - customer_id serial PRIMARY KEY, - name VARCHAR UNIQUE, - email VARCHAR NOT NULL, - active bool NOT NULL DEFAULT TRUE -); - -Then, add data: - -INSERT INTO - dbo.customers (name, email) -VALUES - (‘ABC’, 'contact@abc.com'), - ('MBA', 'contact@mba.com'), - ('XYZ', 'contact@xyz.com'); - - -CREATE OR REPLACE FUNCTION dbo.onConflictTestFromSSM() -RETURNS void AS $$ -DECLARE - year1 int; - month1 smallint; -BEGIN - INSERT INTO dbo.customers (NAME, email) - VALUES('MBA','hotline@mbacom') - ON CONFLICT (name ) - DO - UPDATE SET email = EXCLUDED.email || ';' || customers.email; - RAISE INFO 'function executes'; -END; -$$ -LANGUAGE plpgsql; - -ALTER FUNCTION dbo.onConflictTestFromSSM() OWNER TO dbo; -ALTER TABLE dbo.customers OWNER to dbo; -``` -Use SSMS to query dbo.onConflictTestFromSSM(): - -```sql -SELECT * FROM dbo.onConflictTestFromSSM() -EXEC dbo.onConflictTestFromSSM - -SELECT * FROM dbo.customers -``` - -For more information about using Babelfish from the TDS port and the PostgreSQL port, [visit the Babelfish website](https://babelfishpg.org/docs/usage/interoperability/). diff --git a/_workaround/workarounds_toc.md b/_workaround/workarounds_toc.md index ca2a06a6..b1627ed1 100644 --- a/_workaround/workarounds_toc.md +++ b/_workaround/workarounds_toc.md @@ -10,14 +10,12 @@ You can use the workarounds in this section to replace unsupported SQL Server sy | ------- | ------- | | SQL Server Replication | [PostgreSQL Replication ](https://www.postgresql.org/docs/current/high-availability) | | DBCC CLEANTABLE | [PostgreSQL VACCUUM utilities](https://www.postgresql.org/docs/15/routine-vacuuming) | -| SQL Server full-text search | [PostgreSQL full-text search ](https://www.postgresql.org/docs/15/textsearch) | | SQL Profiler | [auto_explain ](https://www.postgresql.org/docs/current/auto-explain) | -| SQL Server spatial features | [PostGIS spatial data handler](https://postgis.net) | + ## Workaround List - [COLLATE DATABASE_DEFAULT](https://babelfishpg.org/docs/workaround/collate_database_default) - [Dynamically defined cursors](https://babelfishpg.org/docs/workaround/dynamically_defined_cursor) -- [Partitioning workaround for a cluster running in Single DB mode](https://babelfishpg.org/docs/workaround/partitioned_table) - [Rebuilding table indexes](https://babelfishpg.org/docs/workaround/rebuilding_table_indexes) \ No newline at end of file diff --git a/extractor/overrides.cfg b/extractor/overrides.cfg index 75060fc4..54af223b 100644 --- a/extractor/overrides.cfg +++ b/extractor/overrides.cfg @@ -1,6 +1,3 @@ -[Partitioning] -doctxt=[Partitioning Workaround](https://babelfishpg.org/docs/workaround/partitioned_table/) - Babelfish code supports PostgreSQL-style partitioning on the PostgreSQL port, but use of PostgreSQL-styled partitioned tables from the TDS port is not recommended. - [SET ROWCOUNT] doctxt=[SET ROWCOUNT workaround](https://babelfishpg.org/docs/workaround/set_rowcount/) From dece504f5738c03e45b3c3e87ad05ae056b8a760 Mon Sep 17 00:00:00 2001 From: Shard Gupta Date: Tue, 8 Oct 2024 17:22:50 +0530 Subject: [PATCH 2/7] Fix broken PostgreSQL documentation links Signed-off-by: Shard Gupta --- _workaround/workarounds_toc.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_workaround/workarounds_toc.md b/_workaround/workarounds_toc.md index b1627ed1..38199c1f 100644 --- a/_workaround/workarounds_toc.md +++ b/_workaround/workarounds_toc.md @@ -8,9 +8,9 @@ You can use the workarounds in this section to replace unsupported SQL Server sy | SQL Server feature | PostgreSQL feature | | ------- | ------- | -| SQL Server Replication | [PostgreSQL Replication ](https://www.postgresql.org/docs/current/high-availability) | -| DBCC CLEANTABLE | [PostgreSQL VACCUUM utilities](https://www.postgresql.org/docs/15/routine-vacuuming) | -| SQL Profiler | [auto_explain ](https://www.postgresql.org/docs/current/auto-explain) | +| SQL Server Replication | [PostgreSQL Replication ](https://www.postgresql.org/docs/current/high-availability.html) | +| DBCC CLEANTABLE | [PostgreSQL VACCUUM utilities](https://www.postgresql.org/docs/current/routine-vacuuming.html) | +| SQL Profiler | [auto_explain ](https://www.postgresql.org/docs/current/auto-explain.html) | From bc49875aa1c6b4ac69cf1cd466b4ec2f974e7b1a Mon Sep 17 00:00:00 2001 From: Shard Gupta Date: Tue, 8 Oct 2024 17:33:44 +0530 Subject: [PATCH 3/7] Remove COLLATE database_default workaround Signed-off-by: Shard Gupta --- _workaround/collate_database_default.md | 39 ------------------------- _workaround/workarounds_toc.md | 1 - extractor/overrides.cfg | 6 ---- 3 files changed, 46 deletions(-) delete mode 100644 _workaround/collate_database_default.md diff --git a/_workaround/collate_database_default.md b/_workaround/collate_database_default.md deleted file mode 100644 index 1df12b9f..00000000 --- a/_workaround/collate_database_default.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: default -title: COLLATE DATABASE_DEFAULT -nav_order: 2 ---- - -## COLLATE DATABASE_DEFAULT - - -In a T-SQL `CREATE TABLE` statement, you can include the `COLLATE DATABASE_DEFAULT` to specify that a column or table should use the database's default collation. In Babelfish, you should either remove the COLLATE DATABASE_DEFAULT clause, or specify the collation name. - -```sql -DROP TABLE IF EXISTS t1 --- This CREATE TABLE statement works in T-SQL but not in Babelfish. -CREATE TABLE t1( col1 NVARCHAR(24) COLLATE DATABASE_DEFAULT NOT NULL ) - -DROP TABLE IF EXISTS t1 --- This CREATE TABLE statement works the same in T-SQL and Babelfish. -CREATE TABLE t1( col1 NVARCHAR(24) NOT NULL ) -``` - -Removing the COLLATE DATABASE_DEFAULT clause as shown above is generally considered preferable, because you don't have to hardcode any collation names in your source code. If you do want to specify the exact collation name instead, you can retrieve the collation for the database you're using with the following command: - -```sql -SELECT CAST(DATABASEPROPERTYEX('my_database', 'Collation') AS varchar(64)) AS CollationId - -CollationId ----------------------------------------------------------------- -sql_latin1_general_cp1_ci_as -``` - -Then, specify the database's collation instead of `DATABASE_DEFAULT` in Babelfish. - -```sql -drop table if exists t1 -CREATE TABLE t1( col1 NVARCHAR(24) COLLATE sql_latin1_general_cp1_ci_as NOT NULL ) -``` - -For more information about using Babelfish from the TDS port and the PostgreSQL port, [visit the Babelfish website](https://babelfishpg.org/docs/usage/interoperability/). diff --git a/_workaround/workarounds_toc.md b/_workaround/workarounds_toc.md index 38199c1f..29241055 100644 --- a/_workaround/workarounds_toc.md +++ b/_workaround/workarounds_toc.md @@ -16,6 +16,5 @@ You can use the workarounds in this section to replace unsupported SQL Server sy ## Workaround List -- [COLLATE DATABASE_DEFAULT](https://babelfishpg.org/docs/workaround/collate_database_default) - [Dynamically defined cursors](https://babelfishpg.org/docs/workaround/dynamically_defined_cursor) - [Rebuilding table indexes](https://babelfishpg.org/docs/workaround/rebuilding_table_indexes) \ No newline at end of file diff --git a/extractor/overrides.cfg b/extractor/overrides.cfg index 54af223b..d5f4ae18 100644 --- a/extractor/overrides.cfg +++ b/extractor/overrides.cfg @@ -1,12 +1,6 @@ [SET ROWCOUNT] doctxt=[SET ROWCOUNT workaround](https://babelfishpg.org/docs/workaround/set_rowcount/) -[COLLATE] -rule=collation -list=DATABASE_DEFAULT -supported-2.2.0=DATABASE_DEFAULT -doctxt=[COLLATE DATABASE_DEFAULT workaround](https://babelfishpg.org/docs/workaround/collate_database_default/) - [Parameter value DEFAULT] rule=execute_parameter,function_call list=procedure,function From b21040dcc2474d6af404c642b8e8aad4bc8d5aa7 Mon Sep 17 00:00:00 2001 From: Shard Gupta Date: Tue, 8 Oct 2024 17:36:58 +0530 Subject: [PATCH 4/7] Fixed veriage Signed-off-by: Shard Gupta --- _faq/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_faq/index.md b/_faq/index.md index c541e22e..dcc7f573 100644 --- a/_faq/index.md +++ b/_faq/index.md @@ -55,7 +55,7 @@ serverproperty ## Can I use a database with the TDS protocol and the PostgreSQL protocol at the same time? -Yes. A database can support PostgreSQL syntax and SQL Server (TDS protocol) syntax at the same time, but [objects created in one syntax may not be accessible to the other syntax](https://babelfishpg.org/docs/usage/interoperability/). +Yes. A database can support PostgreSQL syntax and SQL Server (TDS protocol) syntax at the same time, but please refer to the [Interoperability](https://babelfishpg.org/docs/usage/interoperability/) guidance section. ### Which TDS clients are known to work with Babelfish? From dcd6b027786527e75346c3404155b11f6f018dbd Mon Sep 17 00:00:00 2001 From: Shard Gupta Date: Tue, 8 Oct 2024 17:43:22 +0530 Subject: [PATCH 5/7] Update client tools ordering Signed-off-by: Shard Gupta --- _client/other-tools.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/_client/other-tools.md b/_client/other-tools.md index 60485ca5..6e9bda3e 100644 --- a/_client/other-tools.md +++ b/_client/other-tools.md @@ -16,13 +16,18 @@ if you face an issue. The following interfaces are officially supported: +- Open Database Connectivity (ODBC) - OLEDB Provider/MSOLEDBSQL -- OLEDB Driver/SQLOLEDB (deprecated by Microsoft) -- .NET Data Provider for SQL Server -- SQL Server Native Client 11.0 (deprecated by Microsoft) +- Java Database Connectivity (JDBC) version 8.2.2 (mssql-jdbc-8.2.2) and higher - Microsoft SqlClient Data Provider for SQL Server -- Open Database Connectivity (ODBC) -- Java Database Connectivity (JDBC) +- .NET Data Provider for SQL Server +- SQL Server Native Client 11.0 (deprecated) +- OLEDB Driver/SQLOLEDB (deprecated) + + + + + More connectivity drivers might be added in the future. Since Babelfish supports the TDS protocol, most TDS-based client applications are expected to work with Babelfish. From ca6d79a39d9055a10966ae9c07e5a0ed161cc647 Mon Sep 17 00:00:00 2001 From: Shard Gupta Date: Tue, 8 Oct 2024 17:47:44 +0530 Subject: [PATCH 6/7] Removed unnecessary blank lines Signed-off-by: Shard Gupta --- _client/other-tools.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/_client/other-tools.md b/_client/other-tools.md index 6e9bda3e..bce30e7d 100644 --- a/_client/other-tools.md +++ b/_client/other-tools.md @@ -24,11 +24,6 @@ The following interfaces are officially supported: - SQL Server Native Client 11.0 (deprecated) - OLEDB Driver/SQLOLEDB (deprecated) - - - - - More connectivity drivers might be added in the future. Since Babelfish supports the TDS protocol, most TDS-based client applications are expected to work with Babelfish. From e45e571a18fbeb5d72da15ce4f4193e3e64636df Mon Sep 17 00:00:00 2001 From: Shard Gupta Date: Tue, 8 Oct 2024 17:52:31 +0530 Subject: [PATCH 7/7] Empty commit Signed-off-by: Shard Gupta --- _client/other-tools.md | 1 - 1 file changed, 1 deletion(-) diff --git a/_client/other-tools.md b/_client/other-tools.md index bce30e7d..6ca24c7b 100644 --- a/_client/other-tools.md +++ b/_client/other-tools.md @@ -26,4 +26,3 @@ The following interfaces are officially supported: More connectivity drivers might be added in the future. Since Babelfish supports the TDS protocol, most TDS-based client applications are expected to work with Babelfish. -