private static string GetTableName(VfpModificationCommandTree modificationCommandTree)
        {
            var formatter = new DmlSqlFormatter();

            modificationCommandTree.Target.Expression.Accept(formatter);

            return(formatter.ToString().Trim());
        }
        private static void GenerateReturningSql(VfpProviderManifest vfpManifest, VfpModificationCommandTree commandTree, DmlSqlFormatter formatter, VfpExpression returning)
        {
            if (returning == null)
            {
                return;
            }

            formatter.WriteLine(Indentation.Same);
            formatter.Write(VfpCommand.SplitCommandsToken);
            formatter.WriteLine(Indentation.Same);

            // select
            formatter.Write("SELECT ");
            returning.Accept(formatter);
            formatter.WriteLine(Indentation.Same);

            // from
            formatter.Write("FROM ");
            commandTree.Target.Expression.Accept(formatter);
            formatter.WriteLine(Indentation.Same);

            // where
            formatter.Write("WHERE ");

            var table    = ((VfpScanExpression)commandTree.Target.Expression).Target;
            var identity = false;
            var first    = true;

            foreach (var keyMember in table.ElementType.KeyMembers)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    formatter.Write(" and ");
                }

                formatter.Write(keyMember);

                // retrieve member value sql. the translator remembers member values
                // as it constructs the DML statement (which precedes the "returning"
                // SQL)
                DbParameter value;
                if (formatter.memberValues.TryGetValue(keyMember, out value))
                {
                    formatter.Write(" = ");
                    formatter.Write(value.ParameterName);
                }
                else
                {
                    if (identity)
                    {
                        throw new NotSupportedException(string.Format("Server generated keys are only supported for identity columns. More than one key column is marked as server generated in table '{0}'.", table.Name));
                    }

                    formatter.Write(" = ");
                    formatter.Write(VfpCommand.ExecuteScalarBeginDelimiter);
                    formatter.Write("=");
                    formatter.Write(GetTableName(commandTree));
                    formatter.Write(".");
                    formatter.Write(keyMember.Name);
                    formatter.Write(VfpCommand.ExecuteScalarEndDelimiter);
                    formatter.Write(" ");

                    identity = true;
                }
            }
        }