import {
  type EntityProperty,
  type IsolationLevel,
  RawQueryFragment,
  type SimpleColumnMeta,
  Type,
} from '@mikro-orm/core';
import { AbstractSqlPlatform } from '../../AbstractSqlPlatform.js';
import type { IndexDef } from '../../typings.js';
import { PostgreSqlNativeQueryBuilder } from './PostgreSqlNativeQueryBuilder.js';
import { PostgreSqlSchemaHelper } from './PostgreSqlSchemaHelper.js';
import { PostgreSqlExceptionConverter } from './PostgreSqlExceptionConverter.js';
export declare class BasePostgreSqlPlatform extends AbstractSqlPlatform {
  #private;
  protected readonly schemaHelper: PostgreSqlSchemaHelper;
  protected readonly exceptionConverter: PostgreSqlExceptionConverter;
  createNativeQueryBuilder(): PostgreSqlNativeQueryBuilder;
  usesReturningStatement(): boolean;
  usesCascadeStatement(): boolean;
  supportsNativeEnums(): boolean;
  usesEnumCheckConstraints(): boolean;
  supportsMaterializedViews(): boolean;
  supportsCustomPrimaryKeyNames(): boolean;
  getCurrentTimestampSQL(length: number): string;
  getDateTimeTypeDeclarationSQL(column: { length?: number }): string;
  getDefaultDateTimeLength(): number;
  getTimeTypeDeclarationSQL(): string;
  getIntegerTypeDeclarationSQL(column: { length?: number; autoincrement?: boolean; generated?: string }): string;
  getBigIntTypeDeclarationSQL(column: { autoincrement?: boolean }): string;
  getTinyIntTypeDeclarationSQL(column: { length?: number; unsigned?: boolean; autoincrement?: boolean }): string;
  getUuidTypeDeclarationSQL(column: { length?: number }): string;
  getFullTextWhereClause(prop: EntityProperty): string;
  supportsCreatingFullTextIndex(): boolean;
  getFullTextIndexExpression(
    indexName: string,
    schemaName: string | undefined,
    tableName: string,
    columns: SimpleColumnMeta[],
  ): string;
  normalizeColumnType(
    type: string,
    options: {
      length?: number;
      precision?: number;
      scale?: number;
      autoincrement?: boolean;
    },
  ): string;
  getMappedType(type: string): Type<unknown>;
  getRegExpOperator(val?: unknown, flags?: string): string;
  getRegExpValue(val: RegExp): {
    $re: string;
    $flags?: string;
  };
  isBigIntProperty(prop: EntityProperty): boolean;
  getArrayDeclarationSQL(): string;
  getFloatDeclarationSQL(): string;
  getDoubleDeclarationSQL(): string;
  getEnumTypeDeclarationSQL(column: { fieldNames: string[]; items?: unknown[]; nativeEnumName?: string }): string;
  supportsMultipleStatements(): boolean;
  getBeginTransactionSQL(options?: { isolationLevel?: IsolationLevel; readOnly?: boolean }): string[];
  marshallArray(values: string[]): string;
  unmarshallArray(value: string): string[];
  getVarcharTypeDeclarationSQL(column: { length?: number }): string;
  getCharTypeDeclarationSQL(column: { length?: number }): string;
  getIntervalTypeDeclarationSQL(column: { length?: number }): string;
  getBlobDeclarationSQL(): string;
  getJsonDeclarationSQL(): string;
  getSearchJsonPropertyKey(
    path: string[],
    type: string | undefined | Type,
    aliased: boolean,
    value?: unknown,
  ): string | RawQueryFragment;
  getJsonIndexDefinition(index: IndexDef): string[];
  quoteIdentifier(
    id:
      | string
      | {
          toString: () => string;
        },
    quote?: string,
  ): string;
  private pad;
  /** @internal */
  formatDate(date: Date): string;
  indexForeignKeys(): boolean;
  getDefaultMappedType(type: string): Type<unknown>;
  supportsSchemas(): boolean;
  getDefaultSchemaName(): string | undefined;
  /**
   * Returns the default name of index for the given columns
   * cannot go past 63 character length for identifiers in MySQL
   */
  getIndexName(
    tableName: string,
    columns: string[],
    type: 'index' | 'unique' | 'foreign' | 'primary' | 'sequence',
  ): string;
  getDefaultPrimaryName(tableName: string, columns: string[]): string;
  /**
   * @inheritDoc
   */
  castColumn(prop?: { columnTypes?: string[] }): string;
  getJsonArrayFromSQL(
    column: string,
    alias: string,
    _properties: {
      name: string;
      type: string;
    }[],
  ): string;
  getJsonArrayElementPropertySQL(alias: string, property: string, type: string): string;
  getDefaultClientUrl(): string;
}
