@@ -411,6 +411,20 @@ public override string ToTableNamesWithRowCountsStatement(bool live, string sche
411411 }
412412
413413 public override bool DoesTableExist ( IDbCommand dbCmd , string tableName , string schema = null )
414+ {
415+ var sql = DoesTableExistSql ( dbCmd , tableName , schema ) ;
416+ var result = dbCmd . ExecLongScalar ( sql ) ;
417+ return result > 0 ;
418+ }
419+
420+ public override async Task < bool > DoesTableExistAsync ( IDbCommand dbCmd , string tableName , string schema = null , CancellationToken token = default )
421+ {
422+ var sql = DoesTableExistSql ( dbCmd , tableName , schema ) ;
423+ var result = await dbCmd . ExecLongScalarAsync ( sql , token ) ;
424+ return result > 0 ;
425+ }
426+
427+ private string DoesTableExistSql ( IDbCommand dbCmd , string tableName , string schema )
414428 {
415429 var sql = ! Normalize || ReservedWords . Contains ( tableName )
416430 ? "SELECT COUNT(*) FROM pg_class WHERE relname = {0} AND relkind = 'r'" . SqlFmt ( tableName )
@@ -424,39 +438,62 @@ public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string s
424438 schema = builder . SearchPath ;
425439 if ( schema == null )
426440 schema = "public" ;
427-
441+
428442 // If a search path (schema) is specified, and there is only one, then assume the CREATE TABLE directive should apply to that schema.
429443 if ( ! string . IsNullOrEmpty ( schema ) && ! schema . Contains ( "," ) )
430444 {
431445 sql = ! Normalize || ReservedWords . Contains ( schema )
432- ? "SELECT COUNT(*) FROM pg_class JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace WHERE relname = {0} AND relkind = 'r' AND nspname = {1}" . SqlFmt ( tableName , schema )
433- : "SELECT COUNT(*) FROM pg_class JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace WHERE lower(relname) = {0} AND relkind = 'r' AND lower(nspname) = {1}" . SqlFmt ( tableName . ToLower ( ) , schema . ToLower ( ) ) ;
446+ ? "SELECT COUNT(*) FROM pg_class JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace WHERE relname = {0} AND relkind = 'r' AND nspname = {1}"
447+ . SqlFmt ( tableName , schema )
448+ : "SELECT COUNT(*) FROM pg_class JOIN pg_catalog.pg_namespace n ON n.oid = pg_class.relnamespace WHERE lower(relname) = {0} AND relkind = 'r' AND lower(nspname) = {1}"
449+ . SqlFmt ( tableName . ToLower ( ) , schema . ToLower ( ) ) ;
434450 }
435451 }
436452
437- var result = dbCmd . ExecLongScalar ( sql ) ;
438-
439- return result > 0 ;
453+ return sql ;
440454 }
441-
455+
442456 public override bool DoesSchemaExist ( IDbCommand dbCmd , string schemaName )
443457 {
444458 dbCmd . CommandText = $ "SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = '{ GetSchemaName ( schemaName ) . SqlParam ( ) } ');";
445459 var query = dbCmd . ExecuteScalar ( ) ;
446460 return query as bool ? ?? false ;
447461 }
448462
463+ public override async Task < bool > DoesSchemaExistAsync ( IDbCommand dbCmd , string schemaName , CancellationToken token = default )
464+ {
465+ dbCmd . CommandText = $ "SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = '{ GetSchemaName ( schemaName ) . SqlParam ( ) } ');";
466+ var query = await dbCmd . ScalarAsync ( ) ;
467+ return query as bool ? ?? false ;
468+ }
469+
449470 public override string ToCreateSchemaStatement ( string schemaName )
450471 {
451472 var sql = $ "CREATE SCHEMA { GetSchemaName ( schemaName ) } ";
452473 return sql ;
453474 }
454475
455476 public override bool DoesColumnExist ( IDbConnection db , string columnName , string tableName , string schema = null )
477+ {
478+ var sql = DoesColumnExistSql ( columnName , tableName , ref schema ) ;
479+ var result = db . SqlScalar < long > ( sql , new { tableName , columnName , schema } ) ;
480+ return result > 0 ;
481+ }
482+
483+ public override async Task < bool > DoesColumnExistAsync ( IDbConnection db , string columnName , string tableName , string schema = null ,
484+ CancellationToken token = default )
485+ {
486+ var sql = DoesColumnExistSql ( columnName , tableName , ref schema ) ;
487+ var result = await db . SqlScalarAsync < long > ( sql , new { tableName , columnName , schema } , token ) ;
488+ return result > 0 ;
489+ }
490+
491+ private string DoesColumnExistSql ( string columnName , string tableName , ref string schema )
456492 {
457493 var sql = ! Normalize || ReservedWords . Contains ( tableName )
458494 ? "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName" . SqlFmt ( tableName )
459- : "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE lower(TABLE_NAME) = @tableName" . SqlFmt ( tableName . ToLower ( ) ) ;
495+ : "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE lower(TABLE_NAME) = @tableName" . SqlFmt (
496+ tableName . ToLower ( ) ) ;
460497
461498 sql += ! Normalize || ReservedWords . Contains ( columnName )
462499 ? " AND COLUMN_NAME = @columnName" . SqlFmt ( columnName )
@@ -472,9 +509,7 @@ public override bool DoesColumnExist(IDbConnection db, string columnName, string
472509 schema = schema . ToLower ( ) ;
473510 }
474511
475- var result = db . SqlScalar < long > ( sql , new { tableName , columnName , schema } ) ;
476-
477- return result > 0 ;
512+ return sql ;
478513 }
479514
480515 public override string ToExecuteProcedureStatement ( object objWithProperties )
0 commit comments