jmueller17 / Aixada

Aixada helps self-managed consumption cooperatives to organize their flow of products, money, and information.
Other
33 stars 37 forks source link

Parece que SQL_MODE = '' no es suficiente para MariaDB v10 #251

Closed jorix closed 2 years ago

jorix commented 5 years ago

En algunas instalaciones al consultar productos de un proveedor se produce el error:
"Incorrect date value: '0' for column 'the_date'".

Por ejemplo, en MariaDB 10.3.12, la siguiente sentencia falla con el error mencionado:

SET SESSION SQL_MODE = ''; call get_products_detail('5','0','','0','1','0');
-- dónde '5' es id de un proveedor

Por lo tanto, incluso si se fuerza SQL_MODE='' en php/inc/database.php, la ejecución falla.

Ver propuesta: 397334361240e8bb496fa0495d559b3b05f56c3d

mamuts commented 5 years ago

Bones!

Aquest error també apareix en instalacions que ja estaven funcionant. Tot i modificar el que es proposa l'error continua apareixent al seleccionar un proveidor per fer una nova comanda:

An error "CALL get_products_detail('10','0',",'2019-03-27','0','0') generated error 1406: Data too long...

Alguna idea? Aquests canvis tal com estan fets a la proposta 3973343 no poden generar problemes d'incompatibilitat entre formats en data i varchar?

jorix commented 5 years ago

A @mamuts i a @jmueller17

Aquest error me l'ha reportat la coope Lagranera per email, hi estem treballant però no puc reproduir-lo ni usant MariaDB 10.3.12 (d'aquí ve que preparés el #252)

An error "CALL get_products_detail('10','0',",'2019-03-27','0','0') generated error 1406: Data too long...

Ho miraré...
El 397334361240e8bb496fa0495d559b3b05f56c3d és només una primera proposta per i determinar si pot ser una via de solució.

De tota manera això no hauria de passar ja que les sessions les obra el php/inc/database.php forçant SQL_MODE=''

M'agradaria veure amb quin SQL_MODE i altres variables de sesión actuen en els vostres casos. He penjat un el commit 68e3c327abb9459aa49bae1999a941178463771f que informa d'això des de install.php. Instal·leu-lo i pengeu el resultats del nou botó Get Session sql information.

dmanubens-zz commented 5 years ago

Hola,

Perdoneu que fes el report del bug per mail, no queda la informació per tothom. Continuo per aquí. Com sabeu La Granera tenim la instal·lació de Aixada a 000 webhost, i estava funcionant però crec que ha sigut degut a una actualització de MariaDB aquest gener que va començar a donar els errors de Data too long, en demanar product details. 397334361240e8bb496fa0495d559b3b05f56c3d solucionava parcialment el problema, però encara aparexien errors i vam intentar reproduir les condicions de MySQL via unset del flag SQL_Mode. Si deixem php/inc/database.php com està a master, tot i que s'està forçant

 $this->mysqli->query("SET SESSION SQL_MODE = '';");

get session sql information retorna això

Update Aixada

Session sql information: 

 version = '10.3.13-MariaDB'
 version_comment = 'MariaDB Server'

 SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
 group_concat_max_len = 1048576

 character_set_client = 'utf8'
 character_set_results = 'utf8'
 collation_connection = 'utf8_general_ci'

 current_timestamp = '2019-03-27 09:19:48'
 time_zone = 'SYSTEM'
 PHP-datetime = '2019-03-27 09:19:48'

 schema = 'id6328103_myaixada'

Investigant a https://mariadb.com/kb/en/library/sql-mode/ veig que una forma de desactivar una variable a MariaDB seria aquesta:

$this->mysqli->query("SET @@SQL_MODE = REPLACE(@@SQL_MODE, 'STRICT_TRANS_TABLES', '');");

Desapareix l'error de data too long, però després d'uns dies amb aixada operativa per fer comandes, misteriosament apareix el error que adjunto en la captura de pantalla i que ens impedeix fer comandes. En instal·lació local no hem sigut capaços de reproduir ni jo (amb MySQL) ni @jorix (amb MariaDB 3.10.12). Pot ser que MariaDB 3.10.13 sigui el responsable? Screenshot from 2019-03-24 12-18-06

BTW, com a pla de contingència hem decidit moure el hosting a Pangea, per poder continuar amb la operativa.

jmueller17 commented 5 years ago

Nosotros funcionamos con pangea y de momento sin problemas. Ojo también con 000 webhost No sé desde cuando lo tenéis alojado allí, pero hubo un data breach importante hace tiempo...

jorix commented 5 years ago

@dmanubens (@mamuts , si pots prova-ho també)

Contesto ràpit que avui tinc poc temps...

Queda clar que no actuen les sentencies que alteren el SQL_MODE.

El problema és que:

Session sql information: 
 SQL_MODE = 'STRICT_TRANS_TABLES,...'
 group_concat_max_len = 1048576

hauria de ser:

Session sql information: 
 SQL_MODE = ''
 group_concat_max_len = 255

Camvia les linies 67-68 per aquestes:

    $this->mysqli->query("SET @@SQL_MODE = '';");
    $this->mysqli->query("SET @@group_concat_max_len = 255;");

I torna a enviar el resultat del botó "Get Session sql information"

NOTA: Aquest canvi funciona be amb MySql i MariaDB 10.3.12.

Demà a la tarda faré proves amb MariaDB 10.3.13

dmanubens-zz commented 5 years ago

@jorix al servidor de 000webhost (MariaDB 10.3.13), el canvi que proposes a les linies 67-68

    $this->mysqli->query("SET @@SQL_MODE = '';");
    $this->mysqli->query("SET @@group_concat_max_len = 255;");

no fa efecte per SQL_MODE, pero si per a group_concat_max_len

Update Aixada

Session sql information: 

 version = '10.3.13-MariaDB'
 version_comment = 'MariaDB Server'

 SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
 group_concat_max_len = 255

 character_set_client = 'utf8'
 character_set_results = 'utf8'
 collation_connection = 'utf8_general_ci'

 current_timestamp = '2019-03-27 18:53:08'
 time_zone = 'SYSTEM'
 PHP-datetime = '2019-03-27 18:53:08'

 schema = 'id6328103_myaixada'
dmanubens-zz commented 5 years ago

He descobert una petita subtilitat, passant un espai blanc ' ' enlloc de doble coma '' funciona:

    $this->mysqli->query("SET @@SQL_MODE = ' ';");
Update Aixada

Session sql information: 

 version = '10.3.13-MariaDB'
 version_comment = 'MariaDB Server'

 SQL_MODE = ''
 group_concat_max_len = 255

 character_set_client = 'utf8'
 character_set_results = 'utf8'
 collation_connection = 'utf8_general_ci'

 current_timestamp = '2019-03-27 19:21:44'
 time_zone = 'SYSTEM'
 PHP-datetime = '2019-03-27 19:21:44'

 schema = 'id6328103_myaixada'
dmanubens-zz commented 5 years ago

I... tant misteriosament com havia aparegut, ja NO surt l'error de l'avis de "producte modificat" que he adjuntat en l'screenshot abans i ens impedia fer comandes aquesta setmana...

No acabo d'entendre de si és independent de SQL_MODE='' o no, perquè: 1) amb MySQL i SQL_MODE='' al servidor de debug local i les mateixes dades l'error no es reproduía. 2) amb MariaDB 3.10.13, avui, amb SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION', soc incapaç de reproduïr l'error ...

Intueixo que tindria a veure amb algun producte actiu per a aquesta setmana fins dimarts 26, pero que NOMÉS feia saltar l'error a MariaDB 3.10.13 amb qualsevol valor a SQL_MODE

jorix commented 5 years ago

@dmanubens

He descobert una petita subtilitat, passant un espai blanc ' ' enlloc de doble coma '' funciona

Desconcertant, però efectiu! GENIAL!
(caram amb la versió 10.3.13!!!, suposo interpreta que '' vol dir sense valor i agafa el SQL_MODE del sistema)

No acabo d'entendre de si és independent de SQL_MODE='' o no...

Sí sí, és per això! Aixada requereix treballar amb SQL_MODE=''


En resum, i a falta de proves en altres intal·lacions descartaria la via 397334361240e8bb496fa0495d559b3b05f56c3d i opto per posar:

    $this->mysqli->query("SET @@SQL_MODE = ' ';"); // At least one blank space is required!
                                                   // otherwise, it does not act in MariaDB 10.3.13
    $this->mysqli->query("SET @@group_concat_max_len = 255;");

Si us plau qui pugui que provi amb MariaDB 10.3.13, el aa19ec7e9e3feeae0d5c06d0572d95845ba56767 i que informi del resultar del botó Get Session sql information de install.php proposar en el 68e3c327abb9459aa49bae1999a941178463771f

@mamuts : Només cal canviar les línies 67-68 per aquestes:

    $this->mysqli->query("SET @@SQL_MODE = ' ';");
    $this->mysqli->query("SET @@group_concat_max_len = 255;");

i usar el nou botó de install.php que ja t'he comentat com activar per correu.

jorix commented 5 years ago

NOTA: Ara he provat que Aixada segueix funcionant correctament amb SET @@SQL_MODE = ' '; usant tant MySql com MariaDB 10.3.12.
Deixò per demà a la tarda les proves amb 10.3.13.

dmanubens-zz commented 5 years ago

@jorix

No acabo d'entendre de si és independent de SQL_MODE='' o no...

Sí sí, és per això! Aixada requereix treballar amb SQL_MODE=''

En resum, i a falta de proves en altres intal·lacions descartaria la via 3973343

Entesos, doncs la veritat és que jo tenia aquest commit [ 397334] desplegat alhora que havia trobat la manera de fer l'unset de 'SQL_MODE'. Deu ser això que l'anterior proposta generava problemes i d'aquí l'error de 'producte modificat'... Reverteixo 397334 i deixo amb SQL_MODE=' '

jorix commented 5 years ago

@jmueller17:
En las pruebas con el MariaDB que ayer me descargué

 version = '10.3.13-MariaDB'
 version_comment = 'mariadb.org binary distribution'

no he podido reproducir el error de @dmanubens & @mamuts

Doy por buena la solución:

    $this->mysqli->query("SET @@SQL_MODE = ' ';");
    $this->mysqli->query("SET @@group_concat_max_len = 255;");

que sí he comprobado que no causa mal funcionamiento ni con MySql ni con MariaDB.
Por esto propongo el PR #257 junto con el #256 (este segundo nos ha ayudado a ver las variables de la sesión.

Espero que con esto se acaben las pesadillas con MariaDB ;-)


Gràcies per la col·laboració @dmanubens!