@@ -1725,3 +1725,62 @@ func (c *PostgresConnector) GetVersion(ctx context.Context) (string, error) {
17251725 c .logger .Info ("[postgres] version" , slog .String ("version" , version ))
17261726 return version , nil
17271727}
1728+
1729+ func (c * PostgresConnector ) GetDatabaseVariant (ctx context.Context ) (protos.DatabaseVariant , error ) {
1730+ // First check for Aurora by trying to call aurora_version()
1731+ var auroraVersion string
1732+ err := c .conn .QueryRow (ctx , "SELECT aurora_version()" ).Scan (& auroraVersion )
1733+ if err == nil && auroraVersion != "" {
1734+ return protos .DatabaseVariant_AWS_AURORA , nil
1735+ }
1736+
1737+ // If aurora_version() fails, it's not Aurora - continue checking other variants
1738+ settingsQuery := `
1739+ SELECT name, setting
1740+ FROM pg_settings
1741+ WHERE name IN (
1742+ 'rds.extensions',
1743+ 'cloudsql.logical_decoding',
1744+ 'azure.extensions',
1745+ 'neon.endpoint_id',
1746+ 'extwlist.pscale_allowed_extensions',
1747+ 'supautils.privileged_extensions'
1748+ ) AND setting IS NOT NULL AND setting != ''`
1749+
1750+ rows , err := c .conn .Query (ctx , settingsQuery )
1751+ if err != nil {
1752+ c .logger .Error ("failed to query pg_settings for determining variant" , slog .Any ("error" , err ))
1753+ return protos .DatabaseVariant_VARIANT_UNKNOWN , err
1754+ }
1755+ defer rows .Close ()
1756+
1757+ for rows .Next () {
1758+ var name , setting string
1759+ if err := rows .Scan (& name , & setting ); err != nil {
1760+ c .logger .Warn ("failed to scan from pg_settings" , slog .Any ("error" , err ))
1761+ continue
1762+ }
1763+
1764+ switch name {
1765+ case "rds.extensions" :
1766+ return protos .DatabaseVariant_AWS_RDS , nil
1767+ case "cloudsql.logical_decoding" :
1768+ return protos .DatabaseVariant_GOOGLE_CLOUD_SQL , nil
1769+ case "azure.extensions" :
1770+ return protos .DatabaseVariant_AZURE_DATABASE , nil
1771+ case "neon.endpoint_id" :
1772+ return protos .DatabaseVariant_NEON , nil
1773+ case "extwlist.pscale_allowed_extensions" :
1774+ return protos .DatabaseVariant_PLANETSCALE , nil
1775+ case "supautils.privileged_extensions" :
1776+ return protos .DatabaseVariant_SUPABASE , nil
1777+ }
1778+ }
1779+
1780+ if err := rows .Err (); err != nil {
1781+ c .logger .Error ("error iterating pg_settings rows" , slog .Any ("error" , err ))
1782+ return protos .DatabaseVariant_VARIANT_UNKNOWN , err
1783+ }
1784+
1785+ return protos .DatabaseVariant_VARIANT_UNKNOWN , nil
1786+ }
0 commit comments