Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow Proper Wrapping of Database Names Containing Spaces When Aliasi… #17292

Closed
wants to merge 1 commit into from
Closed

Conversation

voidstate
Copy link
Contributor

…ng Columns (Perfectly Legal in SQL Server)

Currently, when using SQL Server, if you have a database which includes spaces, the grammar handles wrapping it fine.

So this:

My Sample Database.dbo.my_table.my_column

Becomes:

[My Sample Database].[dbo].[my_table].[my_column]

But if you also try to alias a column when the database contains spaces, it breaks.

This:

My Sample Database.dbo.my_table.my_column AS my_aliased_column

Becomes:

[My] AS [Sample]

I have traced the error to Database/Grammar using explode( ' ' ) - the code thinks the spaces in the database name are the spaces around the "AS".

You can fix this by using regex instead of explode, splitting on the "AS" more accurately.

Just replace the explode with this:

$segments = preg_split( '/\s+as\s+/i', $value );

Please note: When you have an Eloquent belongsToMany method that has to include the database name (eg. we need to join across DBs), this type of alias is created automatically, generating this error.

…ng Columns (Perfectly Legal in SQL Server)

Currently, when using SQL Server, if you have a database which includes spaces, the grammar handles wrapping it fine. 

So this:

My Sample Database.dbo.my_table.my_column

Becomes:

[My Sample Database].[dbo].[my_table].[my_column]

But if you also try to alias a column when the database contains spaces, it breaks. 

This:

My Sample Database.dbo.my_table.my_column AS my_aliased_column

Becomes:

[My] AS [Sample]

I have traced the error to Database/Grammar using explode( ' ' ) - the code thinks the spaces in the database name are the spaces around the "AS".

You can fix this by using regex instead of explode, splitting on the "AS" more accurately.

Just replace the explode with this:

$segments = preg_split( '/\s+as\s+/i', $value );

Please note: When you have an Eloquent belongsToMany method that has to include the database name (eg. we need to join across DBs), this type of alias is created automatically, generating this error.
@morloderex
Copy link
Contributor

morloderex commented Jan 12, 2017

This should be overriden for only the Sqlite database grammer

@fernandobandeira
Copy link
Contributor

@morloderex Maybe to SQL Server Grammar then, but MySQL, PostgreSQL and Sqlite also supports spaces on names, so I guess this bug is affecting all of the Grammars...

@taylorotwell
Copy link
Member

Needs tests before it can be merged.

@taylorotwell
Copy link
Member

Please send to 5.4 branch.

@voidstate
Copy link
Contributor Author

I have opened a pull request to 5.4, as asked: #17312

taylorotwell pushed a commit that referenced this pull request Jan 16, 2017
* Can't Wrap DB Names Containing Spaces When Aliasing

Database names containing spaces are perfectly legal in Microsoft SQL Server.

Currently, when using SQL Server, if you have a database which includes spaces, the grammar handles wrapping it fine.

So this:

My Sample Database.dbo.my_table.my_column

Correctly becomes:

[My Sample Database].[dbo].[my_table].[my_column]

*But* if you also try to alias a column when the database contains spaces, it breaks.

This:

My Sample Database.dbo.my_table.my_column AS my_aliased_column

Becomes:

[My] AS [Sample]

I have traced the error to Database/Grammar/wrapAliasedValue() using explode( ' ' ) - the code thinks the spaces in the database name are the spaces around the "AS".

We can fix this by using regex instead of explode, splitting on the "AS" more accurately.

Just replace the explode with this:

$segments = preg_split( '/\s+as\s+/i', $value );

Note: When you have an Eloquent belongsToMany method that has to include the database name (eg. we need to join across DBs), this type of alias is created automatically, generating this error.

I originally committed this to 5.3 (#17292) and was asked to commit here instead.

* Adding Tests

RE: #17312
symfony-splitter pushed a commit to illuminate/database that referenced this pull request Jan 16, 2017
* Can't Wrap DB Names Containing Spaces When Aliasing

Database names containing spaces are perfectly legal in Microsoft SQL Server.

Currently, when using SQL Server, if you have a database which includes spaces, the grammar handles wrapping it fine.

So this:

My Sample Database.dbo.my_table.my_column

Correctly becomes:

[My Sample Database].[dbo].[my_table].[my_column]

*But* if you also try to alias a column when the database contains spaces, it breaks.

This:

My Sample Database.dbo.my_table.my_column AS my_aliased_column

Becomes:

[My] AS [Sample]

I have traced the error to Database/Grammar/wrapAliasedValue() using explode( ' ' ) - the code thinks the spaces in the database name are the spaces around the "AS".

We can fix this by using regex instead of explode, splitting on the "AS" more accurately.

Just replace the explode with this:

$segments = preg_split( '/\s+as\s+/i', $value );

Note: When you have an Eloquent belongsToMany method that has to include the database name (eg. we need to join across DBs), this type of alias is created automatically, generating this error.

I originally committed this to 5.3 (laravel/framework#17292) and was asked to commit here instead.

* Adding Tests

RE: laravel/framework#17312
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants