Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 43 additions & 39 deletions Orm/Xtensive.Orm.Firebird/Sql.Drivers.Firebird/v2_5/Compiler.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2003-2010 Xtensive LLC.
// Copyright (C) 2003-2010 Xtensive LLC.
// All rights reserved.
// For conditions of distribution and use, see license.
// Created by: Csaba Beer
Expand Down Expand Up @@ -74,45 +74,49 @@ public override void Visit(SqlQueryExpression node)
/// <inheritdoc/>
public override void Visit(SqlExtract node)
{
switch (node.IntervalPart) {
case SqlIntervalPart.Day:
Visit(CastToLong(node.Operand / NanosecondsPerDay));
return;
case SqlIntervalPart.Hour:
Visit(CastToLong(node.Operand / (60 * 60 * NanosecondsPerSecond)) % 24);
return;
case SqlIntervalPart.Minute:
Visit(CastToLong(node.Operand / (60 * NanosecondsPerSecond)) % 60);
return;
case SqlIntervalPart.Second:
Visit(CastToLong(node.Operand / NanosecondsPerSecond) % 60);
return;
case SqlIntervalPart.Millisecond:
Visit(CastToLong(node.Operand / NanosecondsPerMillisecond) % MillisecondsPerSecond);
return;
case SqlIntervalPart.Nanosecond:
Visit(CastToLong(node.Operand));
return;
if (node.IsIntervalPart) {
switch (node.IntervalPart) {
case SqlIntervalPart.Day:
Visit(CastToLong(node.Operand / NanosecondsPerDay));
return;
case SqlIntervalPart.Hour:
Visit(CastToLong(node.Operand / (60 * 60 * NanosecondsPerSecond)) % 24);
return;
case SqlIntervalPart.Minute:
Visit(CastToLong(node.Operand / (60 * NanosecondsPerSecond)) % 60);
return;
case SqlIntervalPart.Second:
Visit(CastToLong(node.Operand / NanosecondsPerSecond) % 60);
return;
case SqlIntervalPart.Millisecond:
Visit(CastToLong(node.Operand / NanosecondsPerMillisecond) % MillisecondsPerSecond);
return;
case SqlIntervalPart.Nanosecond:
Visit(CastToLong(node.Operand));
return;
}
}
switch (node.DateTimePart) {
case SqlDateTimePart.DayOfYear:
if (!case_SqlDateTimePart_DayOfYear) {
case_SqlDateTimePart_DayOfYear = true;
Visit(SqlDml.Add(node, SqlDml.Literal(1)));
case_SqlDateTimePart_DayOfYear = false;
}
else
base.Visit(node);
return;
case SqlDateTimePart.Second:
if (!case_SqlDateTimePart_Second) {
case_SqlDateTimePart_Second = true;
Visit(SqlDml.Truncate(node));
case_SqlDateTimePart_Second = false;
}
else
base.Visit(node);
return;
if (node.IsDateTimePart) {
switch (node.DateTimePart) {
case SqlDateTimePart.DayOfYear:
if (!case_SqlDateTimePart_DayOfYear) {
case_SqlDateTimePart_DayOfYear = true;
Visit(SqlDml.Add(node, SqlDml.Literal(1)));
case_SqlDateTimePart_DayOfYear = false;
}
else
base.Visit(node);
return;
case SqlDateTimePart.Second:
if (!case_SqlDateTimePart_Second) {
case_SqlDateTimePart_Second = true;
Visit(SqlDml.Truncate(node));
case_SqlDateTimePart_Second = false;
}
else
base.Visit(node);
return;
}
}
base.Visit(node);
}
Expand Down
8 changes: 4 additions & 4 deletions Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (C) 2003-2010 Xtensive LLC.
// Copyright (C) 2003-2010 Xtensive LLC.
// All rights reserved.
// For conditions of distribution and use, see license.
// Created by: Malisa Ncube
Expand Down Expand Up @@ -211,9 +211,9 @@ public override void VisitSelectLimitOffset(SqlSelect node)

public override void Visit(SqlExtract node)
{
if (node.DateTimePart==SqlDateTimePart.DayOfWeek || node.DateTimePart==SqlDateTimePart.DayOfYear) {
Visit(SqlDml.FunctionCall(node.DateTimePart.ToString(), node.Operand));
return;
if (node.IsDateTimePart && (node.DateTimePart==SqlDateTimePart.DayOfWeek || node.DateTimePart==SqlDateTimePart.DayOfYear)) {
Visit(SqlDml.FunctionCall(node.DateTimePart.ToString(), node.Operand));
return;
}
base.Visit(node);
}
Expand Down
5 changes: 2 additions & 3 deletions Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Translator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -415,9 +415,8 @@ public override string Translate(SqlCompilerContext context, object literalValue
/// <inheritdoc/>
public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section)
{
bool isSecond = node.DateTimePart==SqlDateTimePart.Second || node.IntervalPart==SqlIntervalPart.Second;
bool isMillisecond = node.DateTimePart==SqlDateTimePart.Millisecond ||
node.IntervalPart==SqlIntervalPart.Millisecond;
bool isSecond = node.IsSecondExtraction;
bool isMillisecond = node.IsMillisecondExtraction;
if (!(isSecond || isMillisecond))
return base.Translate(context, node, section);
switch (section) {
Expand Down
128 changes: 66 additions & 62 deletions Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Compiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,69 +97,73 @@ public override void Visit(SqlTrim node)

public override void Visit(SqlExtract node)
{
switch (node.DateTimeOffsetPart) {
case SqlDateTimeOffsetPart.Day:
DateTimeOffsetExtractPart(node.Operand, "DD").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Hour:
DateTimeOffsetExtractPart(node.Operand, "HH24").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Millisecond:
DateTimeOffsetExtractPart(node.Operand, "FF3").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Nanosecond:
DateTimeOffsetExtractPart(node.Operand, "FF9").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Minute:
DateTimeOffsetExtractPart(node.Operand, "MI").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Month:
DateTimeOffsetExtractPart(node.Operand, "MM").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Second:
DateTimeOffsetExtractPart(node.Operand, "SS").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Year:
DateTimeOffsetExtractPart(node.Operand, "YYYY").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.TimeZoneHour:
DateTimeOffsetExtractPart(node.Operand, "TZH").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.TimeZoneMinute:
DateTimeOffsetExtractPart(node.Operand, "TZM").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.DayOfWeek:
DateTimeExtractDayOfWeek(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.DayOfYear:
DateTimeOffsetExtractPart(node.Operand, "DDD").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Date:
DateTimeOffsetTruncate(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.DateTime:
DateTimeOffsetTruncateOffset(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.LocalDateTime:
DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.UtcDateTime:
DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Offset:
DateTimeOffsetPartOffset(node.Operand).AcceptVisitor(this);
return;
if (node.IsDateTimeOffsetPart) {
switch (node.DateTimeOffsetPart) {
case SqlDateTimeOffsetPart.Day:
DateTimeOffsetExtractPart(node.Operand, "DD").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Hour:
DateTimeOffsetExtractPart(node.Operand, "HH24").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Millisecond:
DateTimeOffsetExtractPart(node.Operand, "FF3").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Nanosecond:
DateTimeOffsetExtractPart(node.Operand, "FF9").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Minute:
DateTimeOffsetExtractPart(node.Operand, "MI").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Month:
DateTimeOffsetExtractPart(node.Operand, "MM").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Second:
DateTimeOffsetExtractPart(node.Operand, "SS").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Year:
DateTimeOffsetExtractPart(node.Operand, "YYYY").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.TimeZoneHour:
DateTimeOffsetExtractPart(node.Operand, "TZH").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.TimeZoneMinute:
DateTimeOffsetExtractPart(node.Operand, "TZM").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.DayOfWeek:
DateTimeExtractDayOfWeek(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.DayOfYear:
DateTimeOffsetExtractPart(node.Operand, "DDD").AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Date:
DateTimeOffsetTruncate(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.DateTime:
DateTimeOffsetTruncateOffset(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.LocalDateTime:
DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.UtcDateTime:
DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Offset:
DateTimeOffsetPartOffset(node.Operand).AcceptVisitor(this);
return;
}
}
switch (node.DateTimePart) {
case SqlDateTimePart.DayOfYear:
DateTimeExtractDayOfYear(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimePart.DayOfWeek:
DateTimeExtractDayOfWeek(node.Operand).AcceptVisitor(this);
return;
default:
base.Visit(node);
return;
if (node.IsDateTimePart) {
switch (node.DateTimePart) {
case SqlDateTimePart.DayOfYear:
DateTimeExtractDayOfYear(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimePart.DayOfWeek:
DateTimeExtractDayOfWeek(node.Operand).AcceptVisitor(this);
return;
default:
base.Visit(node);
return;
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions Orm/Xtensive.Orm.Oracle/Sql.Drivers.Oracle/v09/Translator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public override string Translate(SqlCompilerContext context, SqlNextValue node,

public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section)
{
if (node.DateTimePart==SqlDateTimePart.Second || node.IntervalPart==SqlIntervalPart.Second)
if (node.IsSecondExtraction && !node.IsDateTimeOffsetPart)
switch (section) {
case ExtractSection.Entry:
return "TRUNC(EXTRACT(";
Expand All @@ -104,7 +104,7 @@ public override string Translate(SqlCompilerContext context, SqlExtract node, Ex
return base.Translate(context, node, section);
}

if (node.DateTimePart==SqlDateTimePart.Millisecond || node.IntervalPart==SqlIntervalPart.Millisecond)
if (node.IsMillisecondExtraction && !node.IsDateTimeOffsetPart)
switch (section) {
case ExtractSection.Entry:
return "MOD(EXTRACT(";
Expand Down
42 changes: 22 additions & 20 deletions Orm/Xtensive.Orm.PostgreSql/Sql.Drivers.PostgreSql/v8_0/Compiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -276,24 +276,26 @@ private static SqlExpression NpgsqlTypeConstructor(SqlExpression left, SqlExpres
}

public override void Visit(SqlExtract node)
{
switch (node.DateTimeOffsetPart) {
case SqlDateTimeOffsetPart.Date:
DateTimeOffsetExtractDate(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.DateTime:
DateTimeOffsetExtractDateTime(node.Operand).AcceptVisitor(this);
return;

case SqlDateTimeOffsetPart.UtcDateTime:
DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.LocalDateTime:
DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Offset:
DateTimeOffsetExtractOffset(node);
return;
{
if (node.IsDateTimeOffsetPart) {
switch (node.DateTimeOffsetPart) {
case SqlDateTimeOffsetPart.Date:
DateTimeOffsetExtractDate(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.DateTime:
DateTimeOffsetExtractDateTime(node.Operand).AcceptVisitor(this);
return;

case SqlDateTimeOffsetPart.UtcDateTime:
DateTimeOffsetToUtcDateTime(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.LocalDateTime:
DateTimeOffsetToLocalDateTime(node.Operand).AcceptVisitor(this);
return;
case SqlDateTimeOffsetPart.Offset:
DateTimeOffsetExtractOffset(node);
return;
}
}
base.Visit(node);
}
Expand Down Expand Up @@ -323,9 +325,9 @@ protected void DateTimeOffsetExtractOffset(SqlExtract node)
{
using (context.EnterScope(node)) {
context.Output.AppendText(translator.Translate(context, node, ExtractSection.Entry));
var part = node.DateTimePart!=SqlDateTimePart.Nothing
var part = node.IsDateTimePart
? translator.Translate(node.DateTimePart)
: node.IntervalPart!=SqlIntervalPart.Nothing
: node.IsIntervalPart
? translator.Translate(node.IntervalPart)
: translator.Translate(node.DateTimeOffsetPart);
context.Output.AppendText(part);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -331,12 +331,8 @@ public override string Translate(SqlCompilerContext context, SqlArray node, Arra

public override string Translate(SqlCompilerContext context, SqlExtract node, ExtractSection section)
{
var isSecond = node.DateTimePart == SqlDateTimePart.Second
|| node.IntervalPart == SqlIntervalPart.Second
|| node.DateTimeOffsetPart == SqlDateTimeOffsetPart.Second;
var isMillisecond = node.DateTimePart == SqlDateTimePart.Millisecond
|| node.IntervalPart == SqlIntervalPart.Millisecond
|| node.DateTimeOffsetPart == SqlDateTimeOffsetPart.Millisecond;
var isSecond = node.IsSecondExtraction;
var isMillisecond = node.IsMillisecondExtraction;
if (!(isSecond || isMillisecond)) {
return base.Translate(context, node, section);
}
Expand Down
Loading
Loading