protected override void WriteFunctionToSql(QueryExpression queryExpression)
        {
            switch (queryExpression)
            {
            case RandomFunctionExpression randomFunctionExpression:
                Sql.Append($"FLOOR(RANDOM() * {int.MaxValue})::int");
                return;

            case LastInsertIdFunctionExpression lastInsertIdExpression:
                Sql.Append("LASTVAL()");
                return;

            case TableExistsVirtualFunctionExpression tableExistsExpression:
                ExpressionWriter.Visit(
                    Postgresql.Raw($@"SELECT 1 
   FROM   pg_catalog.pg_class c
   JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
   WHERE  n.nspname = current_schema()
   AND    c.relname = '{tableExistsExpression.Table.TableName.Replace("'", "\\'")}'
   AND    c.relkind = 'r'    -- only tables")
                    );
                return;
            }
            base.WriteFunctionToSql(queryExpression);
        }
Ejemplo n.º 2
0
        protected override void WriteFunctionToSql(QueryExpression queryExpression)
        {
            switch (queryExpression)
            {
            case ConcatenateQueryExpression concatenateQueryExpression:
                for (var i = 0; i < concatenateQueryExpression.Expressions.Length; i++)
                {
                    ExpressionWriter.Visit(concatenateQueryExpression.Expressions[i]);
                    if (i < concatenateQueryExpression.Expressions.Length - 1)
                    {
                        Sql.Append(" || ");
                    }
                }
                return;

            case LastInsertIdFunctionExpression lastInsertIdExpression:
                Sql.Append("last_insert_rowid()");
                return;

            case TableExistsVirtualFunctionExpression tableExistsExpression:
                ExpressionWriter.Visit(
                    QueryExpression.Select(
                        new[] { QueryExpression.Value(1) },
                        from: QueryExpression.Table("sqlite_master"),
                        where : QueryExpression.AndAlso(
                            QueryExpression.Compare(QueryExpression.Column("type"), ComparisonOperator.AreEqual, QueryExpression.Value("table")),
                            QueryExpression.Compare(QueryExpression.Column("name"), ComparisonOperator.AreEqual, QueryExpression.Value(tableExistsExpression.Table.TableName))
                            )
                        )
                    );
                return;
            }
            base.WriteFunctionToSql(queryExpression);
        }