This repository has been archived by the owner on Jan 28, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 109
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sql: implement SHOW CREATE DATABASE statement
Signed-off-by: Miguel Molina <miguel@erizocosmi.co>
- Loading branch information
1 parent
b830c9a
commit 979cf83
Showing
6 changed files
with
203 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
package plan | ||
|
||
import ( | ||
"bytes" | ||
"fmt" | ||
|
||
"gopkg.in/src-d/go-mysql-server.v0/sql" | ||
) | ||
|
||
// ShowCreateDatabase returns the SQL for creating a database. | ||
type ShowCreateDatabase struct { | ||
Database sql.Database | ||
IfNotExists bool | ||
} | ||
|
||
const defaultCharacterSet = "utf8mb4" | ||
|
||
var showCreateDatabaseSchema = sql.Schema{ | ||
{Name: "Database", Type: sql.Text}, | ||
{Name: "Create Database", Type: sql.Text}, | ||
} | ||
|
||
// NewShowCreateDatabase creates a new ShowCreateDatabase node. | ||
func NewShowCreateDatabase(db sql.Database, ifNotExists bool) *ShowCreateDatabase { | ||
return &ShowCreateDatabase{db, ifNotExists} | ||
} | ||
|
||
// RowIter implements the sql.Node interface. | ||
func (s *ShowCreateDatabase) RowIter(ctx *sql.Context) (sql.RowIter, error) { | ||
var name = s.Database.Name() | ||
|
||
var buf bytes.Buffer | ||
|
||
buf.WriteString("CREATE DATABASE ") | ||
if s.IfNotExists { | ||
buf.WriteString("/*!32312 IF NOT EXISTS*/ ") | ||
} | ||
|
||
buf.WriteRune('`') | ||
buf.WriteString(name) | ||
buf.WriteRune('`') | ||
buf.WriteString(fmt.Sprintf( | ||
" /*!40100 DEFAULT CHARACTER SET %s COLLATE %s */", | ||
defaultCharacterSet, | ||
defaultCollation, | ||
)) | ||
|
||
return sql.RowsToRowIter( | ||
sql.NewRow(name, buf.String()), | ||
), nil | ||
} | ||
|
||
// Schema implements the sql.Node interface. | ||
func (s *ShowCreateDatabase) Schema() sql.Schema { | ||
return showCreateDatabaseSchema | ||
} | ||
|
||
func (s *ShowCreateDatabase) String() string { | ||
return fmt.Sprintf("SHOW CREATE DATABASE %s", s.Database.Name()) | ||
} | ||
|
||
// Children implements the sql.Node interface. | ||
func (s *ShowCreateDatabase) Children() []sql.Node { return nil } | ||
|
||
// Resolved implements the sql.Node interface. | ||
func (s *ShowCreateDatabase) Resolved() bool { | ||
_, ok := s.Database.(sql.UnresolvedDatabase) | ||
return !ok | ||
} | ||
|
||
// TransformExpressionsUp implements the sql.Node interface. | ||
func (s *ShowCreateDatabase) TransformExpressionsUp(f sql.TransformExprFunc) (sql.Node, error) { | ||
return s, nil | ||
} | ||
|
||
// TransformUp implements the sql.Node interface. | ||
func (s *ShowCreateDatabase) TransformUp(f sql.TransformNodeFunc) (sql.Node, error) { | ||
return f(s) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package plan | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
"gopkg.in/src-d/go-mysql-server.v0/sql" | ||
) | ||
|
||
func TestShowCreateDatabase(t *testing.T) { | ||
require := require.New(t) | ||
|
||
node := NewShowCreateDatabase(sql.UnresolvedDatabase("foo"), true) | ||
iter, err := node.RowIter(sql.NewEmptyContext()) | ||
require.NoError(err) | ||
|
||
rows, err := sql.RowIterToRows(iter) | ||
require.NoError(err) | ||
|
||
require.Equal([]sql.Row{ | ||
{"foo", "CREATE DATABASE /*!32312 IF NOT EXISTS*/ `foo` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8_bin */"}, | ||
}, rows) | ||
|
||
node = NewShowCreateDatabase(sql.UnresolvedDatabase("foo"), false) | ||
iter, err = node.RowIter(sql.NewEmptyContext()) | ||
require.NoError(err) | ||
|
||
rows, err = sql.RowIterToRows(iter) | ||
require.NoError(err) | ||
|
||
require.Equal([]sql.Row{ | ||
{"foo", "CREATE DATABASE `foo` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8_bin */"}, | ||
}, rows) | ||
} |